多线程服务器,用于多个客户端

时间:2011-12-09 10:53:31

标签: c

我正在尝试创建一个服务器,它可以将数据发送到多个客户端,当客户端连接时,它会创建一个线程,当客户端收到一些控制信息时,它会不断向客户端发送数据。停止传输服务器从客户端接收另一个控制请求,接收请求停止有数据发送线程创建的另一个线程。 对于单个客户端,我的代码工作正常,但对于多个客户端,它只向最近到达的客户端发送数据。 你可以建议我让它有用吗。

     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

1 个答案:

答案 0 :(得分:0)

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

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