【问题标题】:server side socket gets into an infinite loop服务器端套接字进入无限循环
【发布时间】:2018-08-03 02:28:03
【问题描述】:

我写了一个服务器和一个客户端套接字代码,如果客户端输入exit 服务器端给出消息“客户端从 127.0.0.1 断开:端口号”并且客户端连接被切断,双方没有任何问题,服务器继续运行正如预期的那样。但是,当我在客户端执行ctrl+c 时,服务器端会陷入无限循环。当客户写“退出”时,我如何防止或捕捉和忽略这一点并给出相同的消息。无限循环返回"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;

【问题讨论】:

  • 没有代码没用。
  • @BaseZen 非常基本的服务器和客户端套接字代码,我在服务器和客户端都有一个 while 循环。
  • 非常基本的肯定,但也有基本的错误,例如在没有正确反应的 while 循环中重复从关闭的套接字读取。所以,代码:-)
  • @BaseZen 更新 :)
  • @BaseZen 你叫它。干得好。

标签: c sockets


【解决方案1】:
        recv(sock2, buffer, 1024, 0);

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

如果recv 返回错误 (-1) 或 eof (0),您应该做的是关闭套接字并退出从客户端读取的循环,即类似于您在 exit 上所做的。

【讨论】:

  • if(recv(sock2, buffer, 1024, 0) == 0){ printf("Client disconnected from %s:%d\n", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port) ); break; } 解决了这个问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 2021-12-30
  • 2011-04-24
相关资源
最近更新 更多