5

我们正在将现有的 Windows 代码移植到 Linux。我们使用 ACE 作为抽象层。我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作。

在linux中与此等效的是什么。我检查了 linux 命名管道(FIFO),但它们似乎只支持一个客户端和服务器,不支持重叠 IO。

你能指导我这件事吗?

4

3 回答 3

5

Unix 套接字。本质上,

  1. 打电话socket(PF_UNIX, SOCK_STREAM, 0)。这将返回一个文件描述符或错误时返回 -1。
  2. 使用类似的东西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);来创建套接字地址。
  3. 打电话bind(fd, &addr, sizeof(addr))
  4. 打电话listen(fd,backlog)来监听连接。backlog是可以存在的未接受()连接的数量。
  5. 使用 accept() 接受来自客户端的连接。这将返回一个新的 FD 或 -1 错误。
  6. 让客户端创建一个类似的套接字并 connect() 到该地址(我认为他们不必绑定)。
  7. 完成后删除文件 /path/to/file (或者如果您稍后要重用它,则将其保留在那里)。

我不确定 Unix 套接字是否支持 SOCK_DGRAM(如果支持,它可能类似于 UDP)。

请参阅 socket(2)、bind(2)、listen(2)、accept(2)、connect(2)、unix(4)、setsockopt(2) 的手册页。

对于“重叠 I/O”,请参见 select(2)。您还可以使用(参见 fcntl(2))启用非阻塞 IO fcntl(fd,F_SETFL,(int)(fcntl(fd,F_GETFL)|O_NONBLOCK)),这意味着 read() 和 write() 永远不会阻塞(这意味着 write() 可以返回短,因此您需要查看返回值)。

我不太确定 Windows 命名管道如何表示来自多个客户端的多个连接,但在 UNIX 中,每个连接都有一个文件描述符(加上一个用于“侦听”套接字)。

于 2010-08-19T17:19:51.110 回答
0

如果我记得的话,我认为他们会使用 fork() 和 stdin/stdout 和/或套接字。我已经在 Python 中完成了它,但是它有一个很好的非常高级的 IPC 包装器,所以我不确定它在 *nix 上是如何工作的。

我很确定的是,不存在重叠 I/O 之类的东西,至少在 Windows 中不存在。与 Windows 相比,锁定原语也有点糟糕,尽管套接字的东西往往表现得更好。

因此,请查看fork()与 IPC 相关的内容。您可能还想投资一个好的参考。我认为那本书相当于 Windows 中的 Hart tome。

于 2010-08-19T16:56:46.623 回答
0

如果通信是本地的,请使用 unix 域套接字或 TCP 套接字。Unix 域套接字可以接收调用进程的凭据。

如果它在网络上,请使用 TCP 套接字。

请注意,不支持 Windows 命名管道的某些功能 - 您无法通过 TCP 套接字传递凭据,因此您需要设计您的协议,使其不需要它们。

于 2010-08-19T18:36:47.087 回答