2011-03-02 114 views
3

我有兩個節點與套接字進行通信。每個節點都有一個讀線程和一個寫線程與另一個進行通信。下面給出的是讀線程的代碼。使用該代碼的兩個節點之間的通信正常工作。但我試圖在這個線程中添加一個select函數,這給我帶來了一些問題(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

必須在每個調用之前建立mastertvselect(),內環路。它們都被select()調用修改。

特別是,如果select()返回0,那麼master現在將爲空。

+0

是的。解決了這個問題。謝謝! – Romonov 2011-03-02 06:52:47