您好我在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)
循环。如果你能提供帮助和感谢,我将很高兴
答案 0 :(得分:1)
线程一旦创建就异步运行,这意味着主线程(执行accept
的线程)应该继续循环并返回接受新连接,无论子线程做什么。
一些建议:
pthread_detach
让线程优雅地处理自己的终止。close(csock)
。void *
传递(但我想你将传递的信息不仅仅是结构中的套接字)您的代码的未来版本。)答案 1 :(得分:0)
返回0语句后无需返回while(1) 在主要循环。
没有。线程退出。它与其他线程中发生的事情无关。
我没有看到当你没有向客户端显示处理网络的任何代码时,你怎么能指望任何人帮你解决客户端断开连接时发生的网络问题。