2011-01-25 53 views
6

任何想法爲什麼當服務器在客戶端等待時寫入套接字select,選擇永不完成?使用select來等待客戶端套接字上的數據

我使用c來在套接字之間進行通信。我的客戶端連接到我的服務器罰款。

socket_desc=socket(AF_INET,SOCK_STREAM,0);//create the socket descriptor 
client->address.sin_addr.s_addr = inet_addr(ipAddress); 
client->address.sin_family = AF_INET; 
client->address.sin_port = htons(port); 

bind(socket_desc,&address,sizeof(address)); 
connect(socket_desc, &address, sizeof(address)); 

當我使用的recv阻塞和監聽數據,一切正常:

int bytesRead = 1; 
while(bytesRead){ 
    int bufsize=1024;   
    char *buffer=malloc(bufsize); 
    bytesRead = recv(socket_desc, buffer, bufsize, 0); 
    printf("CLIENT RECV: %s", buffer); 
} 

如果我嘗試使用選擇,它似乎並沒有讀取任何數據。如果我將STDIN添加到fd_set,我可以強制它從套接字中讀取,但select似乎不會從socket_desc讀取數據中觸發...?

int running = 1; 
while(running){ 
    /* wait for something to happen on the socket */ 
    struct timeval selTimeout; 
    selTimeout.tv_sec = 2;  /* timeout (secs.) */ 
    selTimeout.tv_usec = 0;   /* 0 microseconds */ 
    fd_set readSet; 
    FD_ZERO(&readSet); 
    FD_SET(STDIN_FILENO, &readSet);//stdin manually trigger reading 
    FD_SET(socket_desc, &readSet);//tcp socket 

    int numReady = select(3, &readSet, NULL, NULL, &selTimeout); 
      //IT ONLY GETS PAST SELECT ON RETURN FROM THE KEYBOARD 
    if(numReady > 0){ 
     char buffer[100] = {'\0'}; 
     int bytesRead = read(socket_desc, &buffer, sizeof(buffer)); 
     printf("bytesRead %i : %s", bytesRead, buffer); 
     if(bytesRead == 0){ 
      running = FALSE; 
      printf("Shutdowning client.\n"); 

     } 
    } 

回答

8

的第一個參數來選擇應該是最大的套接字ID加1。所以你的情況,應該是

socket_desc+1 

你可以嘗試用,看看它是否起作用?

只有當您按下鍵盤上的按鍵時,纔會得到它的原因是因爲標準輸入是0,它將在0 - (3 - 1)範圍內,這是檢查的內容。如果您將第一個參數設置爲socket_desc + 1,則應檢查0 - (socket_desc)範圍,以便使用套接字

+1

另外值得注意的是,在多個套接字上選擇時,您應該檢查套接字ID是否使用FD_ISSET設置 – vmpstr 2011-01-25 02:28:45

相關問題