我试图使用TCP和标准的socket.h库在linux上实现一个简单的客户机/服务器程序。服务器处理多个客户端,每个客户机可以随时关闭()或关机()套接字。
在服务器端(使用非阻塞读取):
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?
发布于 2016-01-29 20:18:56
有许多原因,包括但不限于:
这是一个致命的错误,您应该关闭套接字时,您得到它。
每个客户端都可以随时使用
close()或shutdown()来访问套接字。
不,他不能。看上面。
发布于 2016-01-29 20:14:23
如果远程对等点已经干净地关闭了连接,并且没有更多的字节等待在本地端读取,那么是的,recv()应该返回0。因此,如果你得到一个ECONNRESET,那么合理的假设是有序的结束不是已经发生的事情。
ECONNRESET通常表示远程对等端发送了RST数据包,而没有首先干净地关闭连接。这种情况可能发生的原因有很多。或者,正如EJP所观察到的,重置也可能来自本地。
无论如何,在ECONNRESET之后,假设您可以从套接字中进一步读取任何内容是不合理的,因此在您的特殊情况下,您可能应该像处理recv()返回的0 +/-日志一样来处理它。
发布于 2016-01-29 20:10:58
如果客户不读取发送的数据就关闭了他的侧,您可能会得到ECONNRESET。如果他正确地关闭连接,你将得到0。
https://stackoverflow.com/questions/35093071
复制相似问题