Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当远程服务器可能在读取完成之前关闭套接字时,如何在C中处理套接字读取?_C_Sockets_Tcp_Network Programming_Client Server - Fatal编程技术网

当远程服务器可能在读取完成之前关闭套接字时,如何在C中处理套接字读取?

当远程服务器可能在读取完成之前关闭套接字时,如何在C中处理套接字读取?,c,sockets,tcp,network-programming,client-server,C,Sockets,Tcp,Network Programming,Client Server,读取调用上的客户端块等待读取n个字节 服务器写入n个字节并立即关闭连接 在这种情况下,如果套接字在读取完成之前关闭,或者由于其他问题,读取调用是否可以返回负或零?(在本例中,客户机/服务器运行在同一linux设备上) 我面临这样一个场景,但不确定这在TCP/IP子系统中是如何工作的,以及如何解决它 Sever: write close Client: read close TCP以串行方式处理连接,读卡器按照发送方传输的顺序处理所有内容。当发送方关闭连接时,读卡器将在读取所有发送的数据后(而

读取调用上的客户端块等待读取n个字节

服务器写入n个字节并立即关闭连接

在这种情况下,如果套接字在读取完成之前关闭,或者由于其他问题,读取调用是否可以返回负或零?(在本例中,客户机/服务器运行在同一linux设备上)

我面临这样一个场景,但不确定这在TCP/IP子系统中是如何工作的,以及如何解决它

Sever:
write
close

Client:
read
close

TCP以串行方式处理连接,读卡器按照发送方传输的顺序处理所有内容。当发送方关闭连接时,读卡器将在读取所有发送的数据后(而不是之前)获得EOF。

关闭套接字连接的安全方法是首先调用shutdown以发出不写入的信号,继续读取远程端发送的数据,然后关闭读取端并关闭套接字。如果您在读取发送给您的数据之前关闭套接字,操作系统将重置连接(发送设置了RST标志的数据包),远程端将此解释为错误。

谢谢。任何我在这种情况下可能得到负返回值的原因。客户机/服务器运行在同一台机器上,所以我不会假设套接字断开,因为它是一种快速查询响应类型的应用程序。它只是偶尔发生一次,不是每次都发生。客户端工具发送一个命令。服务器发送应答并关闭套接字。客户端读取并关闭套接字。
read()
的负返回表示出现错误。您应该使用
perror()
查看错误消息。perror打印-由对等方重置连接…我确信服务器已写入数据并关闭套接字。客户端在select系统调用时处于while循环中,超时1秒并尝试读取数据。这怎么可能?对于同一用例,这种情况并非每次都会发生。@Joni的回答是,“对等方重置连接”通常意味着您已经写入了一个已经被对等方关闭的连接。Joni在下面说了什么。每个人都应该阅读关于远程主机关闭套接字时丢失数据的最终SO_-LINGER页()。发送最后一条消息的主机应该执行半关闭:关闭(s,SHUT_-WR),然后在调用recv()时循环等待一段合理的时间,直到它返回一个错误或0,表示远程主机已离开或关闭连接。下面的答案可能会解决您的问题,但如果您需要更多帮助,请向我们显示
code
“最终的SO_LINGER页面”不是一个规范性参考。在我几十年的经验中,这种说法“它常常无法达到我们想要的效果——最终传输的千字节或有时传输的兆字节数据永远不会到达”,完全是不真实的当我们在TCP/IP套接字上发出close()时,根据具体情况,内核可能会完全这样做:关闭套接字,并随之关闭TCP/IP连接。事实上,这种情况确实发生了——尽管您的一些数据仍在等待发送——这完全是错误的:这与RFC 793中的规范相反。不确定服务器在发送关闭后需要等待接收多长时间,因为服务器也有其他客户机并且可以工作。如果远程客户端速度较慢,则不希望阻止recv。服务器是单线程的。