【发布时间】:2009-12-11 09:12:08
【问题描述】:
假设您有 2 个套接字(每个都将被其他 TCP 对等点侦听),每个都驻留在同一个进程上,这些套接字如何绑定,这意味着彼此的输入流将绑定到其他的输出流。套接字会不断地携带数据,不会发生等待。通常线程可以解决这个问题,但是,除了创建线程之外,还有更有效的管道套接字方式吗?
【问题讨论】:
假设您有 2 个套接字(每个都将被其他 TCP 对等点侦听),每个都驻留在同一个进程上,这些套接字如何绑定,这意味着彼此的输入流将绑定到其他的输出流。套接字会不断地携带数据,不会发生等待。通常线程可以解决这个问题,但是,除了创建线程之外,还有更有效的管道套接字方式吗?
【问题讨论】:
如果需要将套接字的两端连接到同一个进程,请改用pipe() 函数。该函数返回两个文件描述符,一个用于写入,另一个用于读取。没有必要为此使用 TCP。
更新:根据您对用例的说明,不,没有任何方法可以告诉操作系统将两个不同套接字的末端连接在一起。您必须编写代码从一个套接字读取并将相同的数据写入另一个。根据您的进程的体系结构,您可能需要也可能不需要额外的线程来完成这项工作。例如,如果您的应用程序基于 select() 循环,则无需创建另一个线程。
【讨论】:
select()函数。您没有提到您使用的是哪种语言或框架,所以我假设使用标准套接字库(适用于所有常见操作系统)的 C 语言。 select() 循环体系结构将您的程序安排为具有单个主循环,该循环调用 select() 监视应用程序打开的任何套接字上发生的事件。当事件发生时,您的程序将通过读取或写入套接字(重要的是,不阻塞)对此做出反应,然后返回主循环以等待下一个事件。
您可以避免进程中带有事件队列的线程。 WP Message queue 文章假设您希望进行进程间消息传递,但如果您使用的是套接字,那么您就是在同一个进程上进行进程间消息传递。
【讨论】: