您可以将TCP连接从一个进程传递到另一个进程吗?

时间:2013-09-21 19:19:22

标签: c linux tcp

我正在进行一些网络测试,我正在使用2个只使用函数的小型C程序连接linux盒子:

connect()

连接后,会进行一些小的计算并将其记录到本地文件中,并指示其中一个程序关闭连接,然后在同一端口上运行netcat侦听器。然后第一个程序重试连接并连接到netcat。

我想知道是否有人可以建议是否可以保留初始连接,同时释放端口并将连接传递给该端口上的netcat(以便初始连接不会关闭)。

2 个答案:

答案 0 :(得分:3)

每个TCP连接由四元组(目标IP地址,目标端口,源IP地址,源端口)定义,因此无需在任何一台机器上“释放”端口。

fork()新连接之后,服务器进程通常accept()。父进程关闭其连接描述符的副本(由accept()返回),并等待新连接。子进程关闭原始套接字描述符,并执行应该处理实际连接的所需程序或脚本。在许多情况下,子进程将连接描述符移动到标准输入和标准输出(使用dup2()),这样执行的脚本或程序甚至不需要知道它连接到远程客户端:它写入标准的所有内容输出发送到远程客户端,远程客户端发送的所有内容都可以从标准输入中读取。

如果存在应该处理连接的现有进程,并且两个进程之间存在Unix域套接字连接(流,数据报或seqpacket套接字;没有区别),则可以将连接描述符作为SCM_RIGHTS辅助信息。有关详细信息,请参阅man 2 sendmsgman 2 recvmsgman 3 cmsgman 7 unix。这仅适用于Unix域套接字上的同一台机器,因为内核实际上将描述符从一个进程复制到另一个进程;实际上,内核做了一些时髦的魔术来实现这一点。

如果您的服务器端逻辑类似于

  • 对于每个传入连接:
    1. 做一些计算
    2. 将计算存储到文件中
    3. 将来自连接的传入数据存储到文件(或标准输出)

然后我建议使用pthreads。只需创建所需数量的线程,让所有线程通过调用侦听套接字上的accept()等待传入连接,并让每个线程自己处理连接。您甚至可以使用stdio.h I / O作为文件I / O.对于更复杂的输出 - 每个块的多个语句 - ,您需要每个输出流pthread_mutex_t,并在释放互斥锁之前记住fflush()。我怀疑一个多线程程序可以完成所有这些工作,并且如果被中断(SIGINT又名CTRL+C),则退出很好,不应该超过三百行。

答案 1 :(得分:3)

如果您只需要从流套接字输出数据,或者只需要向其输入输入,则可以将其视为文件句柄。

因此在Posix程序中,您可以使用dup2()将套接字句柄复制到值1,这是标准输出。然后关闭原始手柄。然后使用exec()用“cat”覆盖你的程序,它将从标准输入aka filehandle 1(即你的套接字)写入输出。