我们正在将现有的Windows代码移植到Linux。我们使用ACE作为抽象层。 我们使用Windows命名管道与多个客户端进行通信并执行重叠操作。
在linux中与此相同的是什么。我检查了linux命名管道(FIFO),但它们似乎只支持一个客户端和服务器,并且不支持重叠IO。
你可以指导我这件事。
答案 0 :(得分:4)
Unix套接字。从本质上讲,
socket(PF_UNIX, SOCK_STREAM, 0)
。这将返回文件描述符或错误时返回-1。struct sockaddr_un addr; bzero(addr); addr.sun_len = sizeof(addr); addr.sun_family = PF_UNIX; strncpy(addr.sun_path, "/path/to/file", sizeof(addr.sun_path)-1);
之类的内容创建套接字地址。bind(fd, &addr, sizeof(addr))
。listen(fd,backlog)
以侦听连接。 backlog
是可以存在的un-accept()ed连接数。我不确定Unix套接字是否支持SOCK_DGRAM(如果是这样,它可能类似于UDP)。
请参阅socket(2),bind(2),listen(2),accept(2),connect(2),unix(4),setsockopt(2)的手册页。
对于“重叠I / O”,请参阅select(2)。您还可以使用fcntl(fd,F_SETFL,(int)(fcntl(fd,F_GETFL)|O_NONBLOCK))
启用非阻塞IO(请参阅fcntl(2)),这意味着read()和write()永远不会阻塞(这意味着write()可以返回short,因此您需要查看返回值)。
我不太确定Windows命名管道如何代表来自多个客户端的多个连接,但在UNIX中,每个连接获得一个文件描述符(另外一个用于“监听”套接字)。
答案 1 :(得分:0)
如果我记得的话,我认为他们会做fork()和stdin / stdout和/或套接字。我已经在Python中完成了它,但它有一个非常高级的IPC包装器,所以我不确定它在* nix上是如何工作的。
我非常确定的是,没有重叠I / O这样的东西,至少不像Windows中那样存在。与Windows相比,锁定原语也很糟糕,虽然套接字的内容往往表现得更好。
请查看fork()
及其周围的IPC相关内容。您可能也想投资一个好的reference。我认为这本书相当于Windows中的Hart tome。
答案 2 :(得分:0)
如果通信是本地通信,请使用unix域套接字或TCP套接字。 Unix域套接字可以接收调用进程的凭据。
如果它在网络上使用TCP套接字。
请注意,不支持Windows命名管道的某些功能 - 您无法通过TCP套接字传递凭据,因此您需要设计协议,以便它不需要它们。