gpt4 book ai didi

c - 用于多个客户端的多线程服务器

转载 作者:行者123 更新时间:2023-11-30 18:03:27 26 4
gpt4 key购买 nike

我正在尝试制作一台服务器,它可以将数据发送到多个客户端,当客户端连接时,它会创建一个线程,当它从客户端接收到一些控制信息时,它会不断向客户端发送数据。要停止传输服务器接收来自客户端的另一个控制请求,为了接收请求而停止,有另一个由数据发送线程创建的线程。对于单个客户端,我的代码运行良好,但对于多个客户端,它仅向新到达的客户端发送数据。你能给我一些建议让它发挥作用吗?

     for(i=0;i<N;i++){  // main accept() loop
sin_size = sizeof client_addr;
connected[i] = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
if (connected[i] == -1) {
perror("accept");
continue;
}
inet_ntop(client_addr.ss_family,get_in_addr((struct sockaddr *)&client_addr),s1[i], sizeof s1[i]);
printf("server: got connection from %s\n%d waiting for data request from client:.......\n", s1[i],connected[i]);
fflush(stdout);

ta1->sockid=connected[i];
ta1->count=i;

if(pthread_create(&tid1[i],NULL,service,(void*)ta1)){
fprintf(stderr,"error in creating tid1");
exit(1);
}

}

for(i=0;i<N;i++){
pthread_join(tid1[i],NULL);
}
close(connected[1]);
return 0;
}//end of main


void* service(void* argu)
{
struct thargu *ta=(struct thargu *)argu;
char control;

printf("coming %d\n",ta->sockid);
if(recv(ta->sockid,&control,1,0)==-1)
{perror("error in recv of service");exit(1);}
printf("recv control at %dsockid\n",ta->sockid);
if(pthread_create(&tid2[ta->count],NULL,stoptx,(void*)ta)==-1)
{perror("error in creating tid2");exit(1);}

while(1)
{
if(control=='a')
{
pthread_mutex_lock(&data_lock);

if(send(ta->sockid,&t1,sizeof(struct transfer),0)==-1)
{perror("error in send of service");exit(1);}

control=v;
v='\0';

pthread_mutex_unlock(&data_lock);
printf("data to %d\n",ta->sockid);
fflush(stdout);
sleep(4);
}

if((control=='b') && (ta->count==k))
{k=200; break;}

control='a';
}//end of while
printf("\ncoming\n");
pthread_join(tid2[ta->count],NULL);
pthread_exit(NULL);
}//end of service

void* stoptx(void* sock)
{
struct thargu *ta=(struct thargu *)sock;
char b;

pthread_mutex_lock(&data_lock2);

if(recv(ta->sockid,&v,1,0)==-1)
{perror("error in recv of stoptx");return 0;}
k=ta->count;

pthread_mutex_unlock(&data_lock2);
printf("inside stoptx %d\n",ta->sockid);
pthread_exit(NULL);
}//end of stoptx

最佳答案

由于您没有显示所有代码,所以我必须猜测...我的猜测是因为您在 main 函数中只有一个 ta1 。它是一个指向某个结构的指针,您可以将该指针发送给线程。但由于只有一个指针发送给两个线程,因此两个线程中的变量 ta 都指向相同的结构。因此,当建立第二个连接时,第一个线程的信息将被第二个线程的信息覆盖。

要解决这个问题,您需要创建一个数组,例如 connected 数组。

关于c - 用于多个客户端的多线程服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8444429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com