我写了一个服务器和一个客户端套接字代码,如果客户端输入exit
,服务器端会显示一条消息“客户端与127.0.0.1断开连接:端口号”,并且客户端和服务器双方的连接都没有问题保持预期运行。但是,当我在客户端执行ctrl+c
时,服务器端会陷入无限循环。当客户端写“ exit”时,如何防止或捕获并忽略此问题并给出相同的消息。无限循环返回"Client clicked "
服务器端:
...
while(1){
accept(...)
...
if((pid = fork() == 0){
//close(sock); uncommented this because when I write "exit" it exits as expected but server side throws a "accept:bad file descriptor"
while(1){
recv(sock2, buffer, 1024, 0);
if(strcmp(buffer, "exit") == 0){
printf("Client disconnected from %s:%d\n", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port) );
break;
else{
printf("Client clicked %s\n", buffer);
send(sock2, buffer, strlen(buffer), 0);
bzero(buffer, sizeof(buffer));
}
}
}
}
close(sock);
return 0;
客户端:
...
while(1){
...
if(strcmp(move, "exit") == 0){
close(sock);
printf("Disconnected from the server\n");
exit(0);
}
...
}
close(sock);
return 0;
答案 0 :(得分:0)
recv(sock2, buffer, 1024, 0);
您只需忽略recv
的返回码即可返回读取的字节数。如果客户端断开连接,recv
将返回0。如果发生错误,recv
将返回-1。在这两种情况下,buffer
的内容将保持不变。具体来说,它将不包含exit
,这意味着您的代码将假定为单击。因此,不要以为buffer
仅包含读取的数据,而是通过检查recv
的返回码来确保实际读取了数据。
如果recv
返回错误(-1)或eof(0),该怎么办是关闭套接字并退出从客户端读取的循环,即类似于对{{1 }}。