2013-03-23 87 views
1

我實現C中的socket編程項目我使用掌握插座的問題,並選擇

選擇()

從客戶端等待數據。我有兩個UDP套接字,並且選擇調用總是忽略我的一個套接字。任何人都可以簡要描述我應該從哪裏開始尋找它?這是我的服務器正在做什麼

waitThreshold.tv_sec = 5000; 
waitThreshold.tv_usec = 50; 
if(sd > sd1)  
    max_sd = (sd + 1); 
else if(sd1 > sd) 
    max_sd = (sd1 + 1); 
FD_ZERO(&read_sds); 
FD_SET(sd, &read_sds); 
FD_SET(sd1, &read_sds); 


ret = select(max_sd, &read_sds, NULL, NULL, &waitThreshold); 
if(ret <0) 
{ 
    printf("\nSelect thrown an exception\n"); 
    return 0; 
} 
else if(FD_ISSET(sd, &read_sds)) 
{ 
    // code for socket one 
} 
else if(FD_ISSET(sd1, &read_sds)) 
{ 
    // code for socket two 
} 

回答

2

你寫了else if,所以只有其中一個會運行。

0

一般來說,當使用select()合併多個套接字時,您希望使用for循環而不是使用IF分支代碼。還要注意選擇CHANGE fd_set參數(讀取,寫入和錯誤文件描述符集 - 第2,3,4個參數),並且您需要在每次select()之前重新設置它們。選擇有數據插座一個相當普遍的代碼佈局與多個併發連接讀取會是這樣的:

FD_ZERO(&master_sds); 
FD_ZERO(&read_sds); 

for (i=0; i<number_of_sockets); i++){ 
    FD_SET(sd[i], &master_sds); 
    if sd[i] > max_sd { 
     max_sd=sd[i]; 
    } 
} 

for(;;){ 
    read_sds=master_sds; 
    ret = select(max_sd, &read_sds, NULL, NULL, &waitThreshold); 
    if(ret<0){ 
     printf("\nSelect thrown an exception\n"); 
     return 0; 
    } 
    for(i=0; i<max_sd; i++){ 
     if FD_ISSET(sd[i], &read_fds){ 
      // code for socket i 
     } 
    } 
} 

你可能不希望有一個無限循環池進行數據插座,可以插入一些例如接收其中一個套接字上的特定數據或特定用戶輸入作爲退出條件。希望這可以幫助。