2011-11-04 131 views
0

它是連接到進一步連接到客戶端的中間主機的服務器代碼。 中間服務器的作用是從服務器或客戶端獲取數據並在另一端轉發數據。 假設有兩個客戶端請求數據(ie'a'),所以在我的服務器中會生成兩個用於定期數據的線程,但是當任何客戶端想要退出時發送'b'並且在接收到'b'兩個線程退出。 那麼,你能否給我一些建議,以便在一個請求中只有一個線程退出(即'b')。c socket編程

#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(見client_addr)返回的sockaddr結構來識別。

+0

我做了全局值,因爲我需要檢查每個線程的值和那無限while循環是不斷檢查中間主機接收到的值。所以,有沒有其他方式來跨線程共享數據?角。是服務器不直接與客戶端聯繫,我只有服務器和中間主機之間的單一連接。 – tod

0

這個例子是不安全的或將起作用。 value是一個全局變量,可以被所有線程操縱。接收緩衝區必須在線程內創建。而且,你在主循環中創建了一個忙循環,while循環等待值的改變。如果您有多個客戶端連接,並且一個真正的數據服務器應該回答請求,您必須實現一個客戶端服務器模型。或者如果線程太複雜,請看看select! 。

+0

我做了全局值,因爲我需要在每個線程中檢查其值,並且無限while循環用於連續檢查中間主機接收到的值。那麼,是否有任何其他方式可以跨線程共享數據?角。是服務器不直接與客戶端聯繫,我只有服務器和中間主機之間的單一連接。 – tod