每当客户端断开连接时,多线程服务器都不会继续执行

时间:2012-11-09 14:34:47

标签: c multithreading network-programming posix

您好我在C中使用多线程服务器(TCP),我有一点问题。一切正常,多个线程可以连接到服务器,但每当客户端写入“退出”(这是客户端写入“退出”字符串的条件时,他/她会断开与服务器的连接)服务关闭本身也。因此,通过其他线程的通信会丢失。但是,逻辑上它应该等待其他客户端甚至一些当前客户端断开连接。这是main的一部分,服务器在等待客户端的无限循环中。 hsock是套接字属于服务器的id,csock是客户端的ID。

main(){
.
.
.


while(1){

    if(counter==0)
        printf("waiting for a connection\n");

    csock = (int*)malloc(sizeof(int));

    if((*csock = accept( hsock, (struct sockaddr*)&sadr, &addr_size))!= -1){
    printf("---------------------\nReceived connection from %s\n",inet_ntoa(sadr.sin_addr));
        pthread_create(&thread_id,0,&SocketHandler, (void*)csock );
        counter++;
    }

    else{
     fprintf(stderr, "Error accepting %d\n", errno);
    }
        }// end while
.
.
.
return 0
}

正如您所看到的,每当客户端断开连接时,服务器应该继续等待另一个线程。另一方面,这是SocketHandler函数的最后一部分,它是一个线程函数。

void* SocketHandler(void* csock){
.
.
.

        printf("Client disconnected\n");
        free(csock);
        return 0;
    }

return 0语句之后没有必要返回到main中的while(1)循环。如果你能提供帮助和感谢,我将很高兴

2 个答案:

答案 0 :(得分:1)

线程一旦创建就异步运行,这意味着主线程(执行accept的线程)应该继续循环并返回接受新连接,无论子线程做什么。

一些建议:

  • 如果您的线程可以自主运行,请在创建后使用pthread_detach让线程优雅地处理自己的终止。
  • 在结束帖子之前不要忘记做close(csock)
  • 你不一定需要分配包含套接字描述符的int,只需直接将它作为void *传递(但我想你将传递的信息不仅仅是结构中的套接字)您的代码的未来版本。)

答案 1 :(得分:0)

  

返回0语句后无需返回while(1)   在主要循环。

没有。线程退出。它与其他线程中发生的事情无关。

我没有看到当你没有向客户端显示处理网络的任何代码时,你怎么能指望任何人帮你解决客户端断开连接时发生的网络问题。