一种检测套接字对等端触发断开连接的方法

时间:2014-07-07 06:20:29

标签: linux multithreading sockets tcp

进程是否有办法检测TCP连接的哪一侧触发了第一个FIN? 我的流程与之通信的我的流程或网络实体。

假设我在Linux上有一个多线程进程,其中一个套接字处理与其他网络实体建立的TCP套接字。

理论上,我的进程中的一个线程可以关闭第二个线程处理的套接字(select / read / send)。

是否有办法检测连接的哪一侧首先触发断开连接?

3 个答案:

答案 0 :(得分:0)

只需将某种应用程序级结构与套接字关联即可。如果线程希望关闭或终止连接,则必须在应用程序级结构中指明。

进程中的所有线程都应该是合作的。你不应该进入"一个线程,找出它做了什么或使它做正确的事情。它应该被编码以通知其他线程他们需要知道什么。

答案 1 :(得分:0)

  

进程是否有办法检测TCP连接的哪一侧触发了第一个FIN?

tcpdump可以告诉你。这是一个例子。服务器应用程序侦听7752端口。客户端首先建立连接,然后客户端关闭连接。所以这是输出:

# tcpdump -i lo 'tcp[13] & 1 != 0'
11:12:28.613424 IP localhost.50631 > localhost.7752: Flags [F.], seq 12878459, ack 4245407789, win 276, options [nop,nop,TS val 3690514841 ecr 3690513840], length 0
11:12:28.613720 IP localhost.7752 > localhost.50631: Flags [F.], seq 1, ack 1, win 256, options [nop,nop,TS val 3690514841 ecr 3690514841], length 0

答案 2 :(得分:0)

如果您使用select()或类似内容(poll()epoll()kqueue()等),则应始终监视套接字以确保读取准备就绪。当套接字上的recv()(或read())返回0时,表示另一端已在套接字上发出关闭(通过调用shutdown()或{ {1}})。

如果您希望API检测您是否已使用close()发出了一半,则套接字上的shutdown()(或send())将触发{{1} }。如果write()被忽略,或SIGPIPE传递了SIGPIPE标记,则会出现send()错误。

如果某个线程已在套接字上调用MSG_NOSIGNAL,则该线程尝试在套接字上执行任何I / O将是错误的。结果可能是非确定性的,因为套接字文件描述符可能被进程重用用于某些其他目的。这种错误类似于有一个陈旧的指针指向由其他一些线程分配的释放内存。