首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP : recv()获取ECONNRESET

TCP : recv()获取ECONNRESET
EN

Stack Overflow用户
提问于 2016-01-29 20:02:33
回答 3查看 6.3K关注 0票数 2

我试图使用TCP和标准的socket.h库在linux上实现一个简单的客户机/服务器程序。服务器处理多个客户端,每个客户机可以随时关闭()或关机()套接字。

在服务器端(使用非阻塞读取):

代码语言:javascript
复制
int nBytes;
if ((nBytes = recv(socket, buffer, BUFFER_SIZE, MSG_DONTWAIT)) == -1)
{
    if (errno != EAGAIN && errno != EWOULDBLOCK)
    {
        //print to log
    }

}
if (nBytes == 0)
{

    //other side closed the connection
}

我得到recv()返回-1并将错误设置为ECONNRESET。如果客户端关闭了连接,那么recv()是否应该返回0?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-29 20:18:56

有许多原因,包括但不限于:

  • 对等方故意重置连接。
  • 对等者关闭了连接,而他的未读数据仍然挂起。
  • 您已将数据发送到已被对等方关闭的连接。
  • 您有挂起的写数据,而TCP重试已超时。
  • TCP持活检测到连接丢失。

这是一个致命的错误,您应该关闭套接字时,您得到它。

每个客户端都可以随时使用close()shutdown()来访问套接字。

不,他不能。看上面。

票数 10
EN

Stack Overflow用户

发布于 2016-01-29 20:14:23

如果远程对等点已经干净地关闭了连接,并且没有更多的字节等待在本地端读取,那么是的,recv()应该返回0。因此,如果你得到一个ECONNRESET,那么合理的假设是有序的结束不是已经发生的事情。

ECONNRESET通常表示远程对等端发送了RST数据包,而没有首先干净地关闭连接。这种情况可能发生的原因有很多。或者,正如EJP所观察到的,重置也可能来自本地。

无论如何,在ECONNRESET之后,假设您可以从套接字中进一步读取任何内容是不合理的,因此在您的特殊情况下,您可能应该像处理recv()返回的0 +/-日志一样来处理它。

票数 4
EN

Stack Overflow用户

发布于 2016-01-29 20:10:58

如果客户不读取发送的数据就关闭了他的侧,您可能会得到ECONNRESET。如果他正确地关闭连接,你将得到0。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35093071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档