我正在尝试创建一个服务器,它可以将数据发送到多个客户端,当客户端连接时,它会创建一个线程,当客户端收到一些控制信息时,它会不断向客户端发送数据。停止传输服务器从客户端接收另一个控制请求,接收请求停止有数据发送线程创建的另一个线程。 对于单个客户端,我的代码工作正常,但对于多个客户端,它只向最近到达的客户端发送数据。 你可以建议我让它有用吗。
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
答案 0 :(得分:0)
由于你没有显示所有代码,我不得不猜测......我的猜测是因为你在ta1
函数中只有一个main
。它是指向某个结构的指针,并将指针发送到该线程。但由于只有一个指针,即发送给两个线程,因此两个线程中的变量ta
指向相同的结构。因此,当建立第二个连接时,第一个线程的信息将被第二个线程的信息覆盖。
要解决此问题,您需要创建一个数组,例如connected
数组。