ECONNRESET和WSAECONNRESET怎么产生的以及如何避免

  • Post author:
  • Post category:其他


ECONNRESET是linux环境网络编程产生的错误,错误码为104,

WSAECONNRESET是windows环境网络编程产生的错误,错误码为10054

两者产生的原因都一样,分以下几种情况:

1接收端recv或者read, 对端已经关闭连接,recv/read返回该错误

2 对端重启连接,还未建立连接

3 发送端已经断开连接,但是调用send会触发这个错误

第二点第三点都可以通过判断返回值解决,第一点在一些砍死正常情况下也会触发该错误。

比如对端close(fd),接收端调用recv并没有返回0,而是-1,打印错误码为104或

10054,按道理讲这种情况按照返回值为0处理是可以的,但是尽量将代码写的规范一些,

避免不必要的错误。

为什么close(fd)会导致接收端读到复位RST,也就是收到错误的104呢,

因为close(fd)只是将文件描述符关闭,并没有关闭tcp建立起来的连接,断开连接需要四次握手,

倘若发送端发送缓冲区有数据未发送完或者接受缓冲区有数据未读完,调用close(fd),那么连接并没有关闭,这样,接收端

收到的就是所谓的104或10054错误了。如何避免这个错误呢,就需要我们判断发送端发送和接受操作

是否进行完,也就是判断缓冲区是否有数据,如果有数据需要等待数据处理完毕在关闭,否则会出现上述错误。

我有一个做法是通过调用shutdown(s,