【问题标题】:Why does the server enter an infinite loop while closing client side connection为什么服务器在关闭客户端连接时进入无限循环
【发布时间】:2014-04-10 12:26:05
【问题描述】:

我正在尝试使用 C 通过 Tcp 连接发送数据。

我可以正常发送数据,但是当我关闭客户端应用程序(CTRL-C)时,服务器端的循环会无限运行。

谁能解释我做错了什么?我能做些什么来防止它?

    //Server-Side code. 
while (TRUE)  
{
    accepted_socket = accept(connection_socket, (struct sockaddr*)0, 0)  ; 
    if(accepted_socket < 0 )
    {
        perror("accept function in main() ") ; 
        close(connection_socket)  ;
        exit(1) ; 
    }
    do 
    {
        int recieved_bytes = recv(accepted_socket, &buff,1, 0) ;  // it will store the recieved characters inside the buff. 
        if(recieved_bytes < 0 )
        {
            perror("Error occurred ! Recieved bytes less than zero. in mainloop.") ; 
        }
        printf("%c", buff) ; 
    }
    while(buff!= ' ') ; // This loop runs infinitely.

}   


//Client Side-Code 
char c = 'c' ; 
do  
{
    c = getchar() ; 
    if(send(*connection_socket, &c, 1, 0) < 1 )
    {
        if(errno == ECONNRESET) 
        {
            fprintf(stderr, "Your message couldn't be sent, since connection was reset by the server.\n")  ;
            exit(1) ; 
        }
        perror("Not all bytes sent in send() in main()") ; 
    }
}   

【问题讨论】:

    标签: c sockets tcp infinite-loop


    【解决方案1】:

    您的服务器代码在 2 个循环中运行:外部循环等待更多连接,一旦建立连接,它就会继续运行。

    目前没有理由终止其中之一。如果要终止内部的,还应检查结果值为== 0,表示连接结束。

    即使你这样做

    while (TRUE)  
    {
        accepted_socket = accept(connection_socket, (struct sockaddr*)0, 0);
        if (accepted_socket < 0)
        {
            perror("accept function in main() ");
            close(connection_socket);
            exit(1);
        }
        // here starts the loop for the accepted_socket:
        do
        {
            int recieved_bytes = recv(accepted_socket, &buff,1, 0);  // it will store the recieved characters inside the buff.
            if(recieved_bytes < 0)
            {
                perror("recv");
            }
            size_t i;
            for (i=0; i < received_bytes; i++) printf("%c", buff[i]);
        } while(received_bytes != 0);
    }
    

    你的外循环继续运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2020-01-20
      相关资源
      最近更新 更多