1

您好,我正在使用 C 语言开发多线程服务器 (TCP),对此我有一点问题。一切正常,多个线程可以连接到服务器,但是每当客户端写入“exit”(这是客户端写入“exit”字符串时的条件,他/她会断开与服务器的连接)服务关闭本身也。因此,通过其他线程的通信会丢失。但是,从逻辑上讲,即使某些当前客户端断开连接,它也应该等待其他客户端。这是 main 的一部分,服务器处于等待客户端的无限循环中。hsock是socket的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;
    }

Afterreturn 0语句不是必须返回到while(1)main 中的循环。如果你能提供帮助,我会很高兴,无论如何,谢谢

4

2 回答 2

1

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

一些建议:

  • 如果您的线程可以自主运行,请pthread_detach在创建后使用以让线程优雅地处理自己的终止。
  • 不要忘记close(csock)在结束线程之前做一个。
  • 您不一定需要分配包含套接字描述符的 int ,只需将其作为void *直接传递(但我猜您将在未来版本的代码中传递更多信息,而不仅仅是结构中的套接字)。
于 2012-11-09T18:57:05.570 回答
0

在 return 0 语句之后是否有必要返回 main 中的 while(1) 循环。

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

当您没有向客户端显示任何处理网络的代码时,我看不出您如何期望任何人帮助您解决客户端断开连接时发生的网络问题。

于 2012-11-09T20:57:07.797 回答