Linux 服务器接收到多个FIN数据包

Linux 服务器接收到多个FIN数据包,linux,sockets,networking,tcp,Linux,Sockets,Networking,Tcp,我正在linux设备上运行端口转发代理。使用代理将浏览器中的所有连接重新路由到其他端口 每当代理收到(recv())0字节时,我就使用shutdown关闭与外部世界的连接(通过代理打开)。关闭该连接后,我将关闭与浏览器的连接。安排如下: Connection Out Local Connection 外部世界转发代理(本地框)客户端(本地框) 但是,在同一套接字关闭之前,我在“本地连接”上接收到多个长度为0的数据包。当代理试图关闭与外部世界

我正在linux设备上运行端口转发代理。使用代理将浏览器中的所有连接重新路由到其他端口

每当代理收到(recv())0字节时,我就使用shutdown关闭与外部世界的连接(通过代理打开)。关闭该连接后,我将关闭与浏览器的连接。安排如下:

   Connection Out                     Local Connection    
外部世界转发代理(本地框)客户端(本地框)

但是,在同一套接字关闭之前,我在“本地连接”上接收到多个长度为0的数据包。当代理试图关闭与外部世界的连接时,就会发生这种情况

我的理解是,时间等待值是2*MSL,这相当高(数百秒)。然而,我在几分之一秒内看到多个0字节的数据包。我做错什么了吗?或者我的理解是错误的


谢谢

你怎么看这个?如果read()或recv()返回0,则不应在该套接字上再次调用read()或recv()。嘿,这解决了问题。我对所有文件描述符都执行select()。如果select()返回fd,那么我对它执行recv()。如果I recv(),0,则启动关闭过程。我想知道为什么select()会不断地返回这个文件描述符,即使我在理解它返回了0个字节后读过它。你的解决方案解决了我的问题。我脑子里有个问题。select()告诉你EOS条件仍然存在。shutdown()只关闭出站方向的连接:它对入站方向不做任何操作。EOS后不停止读取的代码在任何程序中都是不可接受的。另外,MSL是六十秒:2*MSL是两分钟,而不是“几百秒”。