2011-11-04 8 views
0

クライアントにさらに接続されている中間ホストに接続されているサーバーのコードです。 中間サーバーの役割は、サーバーまたはクライアントからデータを取得し、それを相手側に転送することです。 2つのクライアントがデータを要求しているとします(つまり'a ')、私のサーバーには定期的なデータ用の2つのスレッドが生成されますが、クライアントが終了したいときは' b 'を送り、出かける したがって、あるリクエスト(つまり、 'b')で1つのスレッドだけが終了するように、いくつかのロジックを教えてください。cソケットプログラミング

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <pthread.h> 


void* periodic(void* t); 
void* oneshot(void* t); 

char value='\0',control; 
static pthread_mutex_t data_lock; 
int no=0,count=0; 

struct transfer 
{ 
int connec; 
struct sockaddr_in client; 
}; 

pthread_t tid1,tid3; 
int main(int argc,char *argv[]) 
{ 
    int sock, connected, bytes_recieved , flag,ret,true; 
    struct sockaddr_in server_addr,client_addr; 
    struct transfer t2,*t1=NULL; 
    t1=&t2; 
    int sin_size; 
    /*here is normal connec stablishment between server and intermidiate host*/ 
    printf("\nTCPServer Waiting for client on port 5000"); 
    fflush(stdout); 


    sin_size = sizeof(struct sockaddr_in); 

    connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size); 


    printf("\n waiting for data request from server2:.......\n"); 
    fflush(stdout); 

    pthread_mutex_init(&data_lock,0); 

    t1->connec=connected; 
    t1->client=client_addr; 

    pthread_create(&tid3,NULL,recieve,(void*)t1); 
    while(1){ 
      if(value=='\0') 
      continue; 
      if(value=='a') 
      { 
       pthread_create(&tid1,NULL,periodic,(void*)t1); 
       count++; 
       control=value; 
       value='\0'; 
      } 

      else if(value=='b') 
      { 
      control=value; 
      pthread_join(tid1,NULL); 
      value='\0'; 
      } 
      }//end of while 
    pthread_join(tid3,NULL); 
    close(connected); 

    }//end of main 

    void* periodic(void* t) 
    { 
    struct transfer *t1=(struct transfer*)t; 
    int data=100; 
    printf("periodic"); 

    fflush(stdout); 
    while(1){ 
      if(control=='b') 
      {count--; 
      data=0; 
      send(t1->connec,&data,sizeof(data),0); 
      printf("1 time\n"); 

      break; 
      } 
      pthread_mutex_lock(&data_lock); 
      send(t1->connec,&data,sizeof(data),0); 
      pthread_mutex_unlock(&data_lock); 

      sleep(4); 
      printf("coming\n"); 
      } 
      printf("comming out\n"); 
      pthread_exit(NULL); 
     }//end of periodic 


     void* recieve(void *t) 
     { 
      struct transfer *t1=(struct transfer*)t; 
      char control; 

     while(1) 
     { 
      //control=value; 
      recv(t1->connec,&value,1,0); 
      //if(value!=control) 
      printf("%c\n",value); 

      } 
      printf("out of recieve\n"); 

     fflush(stdout); 

      pthread_exit(NULL); 
     }//end of recieve 

答えて

1

おそらく、両方のクライアントで同じ「値」を共有しないでください。クライアントとそれに対応する値の配列を持つ方がよいでしょう。クライアントは、acceptによって返されるsockaddr構造体によって識別できます(client_addrを参照)。

+0

私はすべてのスレッドとその無限ループでその値をチェックする必要があるので、値globalを作成しました。中間のホストが受け取った値を継続的にチェックするためです。スレッド間でデータを共有する方法はありますか? pt。サーバーはクライアントと直接接触していません。私はサーバーと中間ホストの間に1つの接続しかありません。 – tod

0

この例は決して安全ではなく、機能しません。 valueは、すべてのスレッドが操作できるグローバル変数です。受信バッファはスレッド内で作成する必要があります。また、メインループでビジーループを作成し、値を変更するのを待っているwhileループを作成しました。複数のクライアント接続があり、その内部に1つの実データサーバーがある場合は、クライアントサーバーモデルを実装する必要があります。スレッドが複雑すぎる場合は、selectをご覧ください! 。

+0

私はすべてのスレッドとその無限ループでその値をチェックする必要があるので、値をグローバルにしました。中間のホストが受け取った値を継続的にチェックするためです。スレッド間でデータを共有する方法はありますか? pt。サーバーはクライアントと直接接触していません。私はサーバーと中間ホストの間に1つの接続しかありません。 – tod

関連する問題