recv不要在客户端套接字close()上发送一个-1

时间:2011-04-04 15:29:55

标签: c linux sockets posix

服务器代码

...
client_socket = accept(server_socket, (struct sockaddr *) &client_address,     &client_address_len);
...
for (;;) {
    if ( recv(client_socket, recived_buffer, MAX_MSG_LENGTH, 0) < 0 ) {
        perror("ERROR leyendo el socket");
        exit(1)
    }
}

如果我杀了客户端,服务器会无限期地停止......

任何提示?

2 个答案:

答案 0 :(得分:11)

当客户端关闭连接时,服务器端recv()调用将返回值0.

来自recv(2)联机帮助页:

  

返回值

     

这些调用返回接收的字节数,如果发生错误则返回-1。当对等体执行有序关闭时,返回值将为0。


值得注意的是,recv()调用将会阻塞,直到有可供读取的数据为止。如果您不想阻止,则需要确保将套接字设置为非阻止,或者在调用select()之前使用poll()recv()查看是否有传入数据。

答案 1 :(得分:2)

recv返回0 - 当对等体关闭连接时,另一部分将其解释为EOF