我正在学习使用c中的套接字。 这是我的代码:
void work_with_client(int client_sock){
char buff[10] = {0};
while(1){
kv_log_message("\tWork with client\n");
int is_received = recv(client_sock, buff, 10, 0);
if(is_received < 0){
perror("Received failed");
} else {
printf("RESPONSE: %s\n", buff);
}
printf("RESPONSE %d\n", is_received);
sleep(1);
}
}
当我通过telnet连接到此服务器并立即断开连接时,服务器打印以下行:
Work with client
RESPONSE:
RESPONSE 10
Work with client
RESPONSE:
RESPONSE 10
Work with client
RESPONSE:
RESPONSE 10
Work with client
RESPONSE:
RESPONSE 10
Work with client
RESPONSE:
RESPONSE 1
Work with client
RESPONSE:
RESPONSE 0
Work with client
我不明白为什么前4个recv
调用获得完整大小的缓冲区数据(我不会从客户端角度向套接字写入任何内容)。
有什么建议?
附:在Mac OS X Yosemite上运行
更新:我在Linux上测试我的程序,在我的情况下,recv调用总是返回0,所以可能是Mac OS X上的telnet问题
答案 0 :(得分:1)
当recv()
返回0
时,这表示对方关闭了连接。
来自man recv
:
返回值
[...]当对等体执行有序关闭时,返回值将为0.
然后您可能想要退出while()
循环。
更新
此外,代码可能会通过将非0
- 终止的“字符串”传递给printf()
来调用未定义的行为。
要解决此问题,请先将char
减去buff
,然后再调整大小,然后添加0
- 终结符。
while (1)
{
ssize_t is_received = recv(client_sock, buff, sizeof buff - 1, 0);
if (is_received < 0){
perror("Received failed");
break;
} else if (is_received == 0) {
printf("%s\n", "peer shutdown");
break;
}
buff[is_received] = '\0';
printf("RESPONSE: %s\n", buff);
}
答案 1 :(得分:0)
好的,我得到它,在Mac OS X(Yosemite)上telnet
发送一些数据,如果你只是通过telnet本身关闭终端没有正确的关闭连接(即放置转义字符和quit
命令)。 / p>
老实说,我不知道是bug还是某种调试行为。