c语言read()返回-1,errno:Connection reset by peer

问题描述:服务器端执行完send()后调用close()关闭socket,然后exit()正常退出。客户端read()函数返回-1,errno104 :   Connection reset by peer,查了一下原因:

这意味着收到了TCP RST包,可以使用tcpdump + wireshark抓包分析,并且连接现在已经关闭,这种情况可能是因为对方崩溃,或者对方调用了close()函数。

解决方法:只要TCP栈的读缓冲里还有未读取(read)数据,则调用close时会直接向对端发送RST。服务器在调用close()函数前,调用shutdown(socket, 2),先关闭socket的读写功能,这时会向客户端发送FIN包,客户端收到FIN包时read()正常返回0,可以完全读取缓冲数据,问题解决。

close()和shutdown()的区别:

请参考:https://blog.csdn.net/xyyaiguozhe/article/details/30252559

你可能感兴趣的:(网络)