服务器端套接字陷入无限循环

时间:2018-08-03 02:28:04

标签: c sockets

我写了一个服务器和一个客户端套接字代码,如果客户端输入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;

1 个答案:

答案 0 :(得分:0)

        recv(sock2, buffer, 1024, 0);

您只需忽略recv的返回码即可返回读取的字节数。如果客户端断开连接,recv将返回0。如果发生错误,recv将返回-1。在这两种情况下,buffer的内容将保持不变。具体来说,它将不包含exit,这意味着您的代码将假定为单击。因此,不要以为buffer仅包含读取的数据,而是通过检查recv的返回码来确保实际读取了数据。

如果recv返回错误(-1)或eof(0),该怎么办是关闭套接字并退出从客户端读取的循环,即类似于对{{1 }}。

相关问题