[英]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.