繁体   English   中英

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

[英]A way to detect which side of the socket peers triggered the disconnection

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

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

从理论上讲,我进程中的一个线程可以关闭由第二个线程处理(选择/读取/发送)的套接字。

有没有办法检测首先触发连接断开的那一侧?

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

进程中的所有线程都应该协同工作。 您不需要“进入”线程来找出它做了什么或使它做正确的事情。 应该对它进行编码,以告知其他线程他们需要知道的内容。

进程是否有办法检测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

如果您正在使用select()或类似的东西( poll()epoll()kqueue()等),则应始终监视套接字的就绪状态。 当套接字上的recv() (或read() )返回0 ,表示另一端已在套接字上发出关闭命令(通过调用shutdown()close() )。

如果您希望API检测到您是否已经使用shutdown()发出了一半关闭通知,则套接字上的send() (或write() )将触发SIGPIPE 如果忽略SIGPIPE ,或者如果传递了send()则传递MSG_NOSIGNAL标志,则将产生EPIPE错误。

如果线程已经在套接字上调用close() ,则该线程尝试在套接字上进行任何I / O操作都是错误的。 结果可能是不确定的,因为套接字文件描述符可能会被进程重用于其他目的。 这种错误类似于使旧的指针指向已由其他线程分配的已释放内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM