问题描述:服务器端执行完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