【发布时间】:2021-06-27 19:45:45
【问题描述】:
我正在尝试使用pthreads 在 C 中实现一个可以同时处理多个连接的 TCP 服务器。
服务器代码
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<pthread.h>
#include<readline/readline.h>
void* connection_handler(void *arg)
{
int sock_number = *((int *)arg);
printf("New connection with socket No. : %d\n",sock_number);
char *message = "!!!!!!!!!!!!!!!!!! MESSAGE !!!!!!!!!!!!!!!!!!\n";
while(1)
{
write(sock_number,message,strlen(message));
}
}
int main()
{
int sock_desc;
sock_desc = socket(AF_INET,SOCK_STREAM,0);
if(sock_desc<0)
{
perror("Socket error");
}
else
{
printf("Socket created!\n");
struct sockaddr_in server,client;
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8080);
if(bind(sock_desc,(struct sockaddr*)&server,sizeof(server))<0)
{
perror("Binding error");
}
else
{
printf("Socket bound to 8080 port!\n");
printf("Listening started.........\nWaiting for connections from clients.........\n");
listen(sock_desc,20);
int sock_size = sizeof(struct sockaddr_in);
int new_socket;
pthread_t pid[50];
int connection_count=0;
while((new_socket = accept(sock_desc,(struct sockaddr*)&client,(socklen_t*)&sock_size)))
{
printf("New connection : %s:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
if(pthread_create(&pid[connection_count++],NULL,connection_handler,&new_socket)!=0)
{
perror("Thread error");
}
}
for(int i=0;i<connection_count;i++)
{
pthread_join(pid[i],NULL);
}
}
}
}
问题是当其中一个客户端停止时,整个服务器程序将同时终止,所有其他客户端也将终止。但是有多个连接没有问题。请告诉服务器为什么会终止即使客户端终止,有什么方法可以保持服务器运行?
【问题讨论】:
-
看起来
while((new_socket = accept(sock_desc,(struct sockaddr*)&client,(socklen_t*)&sock_size)))将循环直到accept返回零。 0 可能是可接受的套接字,accept 在错误时返回负数。杜尔。不,0 应该是标准输入。我认为你永远不会看到 0。 -
线程不断地写入套接字。如果程序写入一个已经关闭的套接字,你应该得到一个 SIGPIPE,如果你没有正确处理它,程序就会崩溃。
-
不要忘记检查来自
write的返回码,以便处理它吐出的错误。 -
',&new_socket' 不,不安全。在处理程序线程可以取消引用指向它的指针之前,第二个连接可能会改变 new_socket:(
-
唯一突出的是您通过引用线程例程传递
new_socket。因此,如果多个客户端快速连续连接,它们就有可能都使用相同的套接字描述符。