2011-03-02 7 views
3

ソケットと通信する2つのノードがあります。各ノードには、読取りスレッドと書込みスレッドがあり、それらのスレッドと通信します。以下は、読み込みスレッドのコードです。そのコードで2つのノード間で通信が正常に動作します。しかし、私はこのスレッドでselect関数を追加しようとしている、それは私に問題を与えている(selectのコードはコメントにある。私は機能を追加するためにコメントを外す)。問題は、1つのノードがメッセージを受信せず、タイムアウトのみです。他のノードは、他のノードからメッセージを取得しますが、決してタイムアウトしません。その問題はselect(コメントを保持する/ * * /)せずに(両方のノードがメッセージを送受信する)ことはありません。選択によるソケットプログラミング

誰でも問題の原因を指摘できますか?ありがとう。

void *Read_Thread(void *arg_passed) 
{ 
    int numbytes; 
    unsigned char *buf; 
    buf = (unsigned char *)malloc(MAXDATASIZE); 

    /* 
    fd_set master; 
    int fdmax; 
    FD_ZERO(&master); 
    */ 

    struct RWThread_args_template *my_args = (struct RWThread_args_template *)arg_passed; 

    /* 
    FD_SET(my_args->new_fd, &master); 
    struct timeval tv; 
    tv.tv_sec = 2; 
    tv.tv_usec = 0; 
    int s_rv = 0; 
    fdmax = my_args->new_fd; 
    */ 

    while(1) 
    { 
     /* 
     s_rv = -1; 
     if((s_rv = select(fdmax+1, &master, NULL, NULL, &tv)) == -1) 
     { 
      perror("select"); 
      exit(1); 
     } 
     if(s_rv == 0) 
     { 
      printf("Read: Timed out\n"); 
      continue; 
     } 
     else 
     { 
      printf("Read: Received msg\n"); 
     } 
     */ 
     if((numbytes = recv(my_args->new_fd, buf, MAXDATASIZE-1, 0)) == -1) 
     { 
      perror("recv"); 
      exit(1); 
     } 
     buf[numbytes] = '\0'; 

     printf("Read: received '%s'\n", buf); 
    } 
    pthread_exit(NULL); 
} 

答えて

3

あなたはループ内で、select()への各呼び出しの前mastertvを設定する必要があります。それらは両方ともselect()コールによって変更されます。

特にselect()0を返した場合、masterは空になります。

+0

はい。問題を解決したありがとう! – Romonov

関連する問題