2013-03-03 59 views
0

這裏是tcp和udp echoclient服務器的代碼片段使用select.i已經完成與民意測驗和 得到了很好的清晰度,但是當來選擇它已經在書中描述,即在下面的代碼我們應該採取的片段(maxpl + 2)我沒有得到它,首先我們爲什麼要採取最大值(tcp_sfd,udp_sfd)?tcp和udp echoclient服務器使用選擇

fd_set fdvar; 
FD_ZERO(&fdvar); 
FD_SET(tcp_sfd,&fdvar); 
FD_SET(udp_sfd,&fdvar); 
int maxpl = max(tcp_sfd,udp_sfd); 
cout << "Waiting for a client...\n"; 

if(select(maxpl+2 ,&fdvar,NULL,NULL,NULL)==-1) 
{ 
     perror("error in select"); 
    } 
if(FD_ISSET(udp_sfd,&fdvar)) 
{ 
     // UDP 
    } 
    else 
    { 
     //TCP 
    } 
+0

你能澄清一下:問題到底是什麼?如果(select(maxpl + 2,&fdvar,NULL,NULL,NULL)== -1) – cnicutar 2013-03-03 11:39:53

+0

perror(「error in select」); }在選擇語句爲什麼他正在(maxpl + 2)和代碼片段爲什麼它是最大(tcpsocketsfd,udpsocketsfd)? – 2013-03-03 11:43:56

+0

你可以發佈完整的代碼而不是代碼片段嗎? – Pradheep 2013-03-03 11:47:14

回答

1

關於這裏所示的代碼,maxpl+2是錯誤的,應該是maxpl+1,雖然使用maxpl+2是無害的。

select需要它的1.參數大於你在fd_set的任何一箇中的最大文件描述符的值。 - 因爲這是select的文檔所說的必須的。

+0

當兩個套接字被創建時有一點疑問,即tcp套接字和udp套接字maxpl = max(tcp_fd,udp_sfd)在接受select語句時意味着什麼? – 2013-03-03 11:56:34

+1

@ user1670364如前所述,選擇需要1.參數比最大的文件描述符值大1。如果您有兩個文件描述符,那麼可以使用max(tcp_fd,udp_sfd)來查找哪個文件最大。 – nos 2013-03-03 12:01:08

0

從手冊頁:

nfds參數指定要測試的描述符的範圍。首先在每組中檢查nfds描述符; 也就是說,應該檢查描述符集中從零到nfds-1的描述符。

select的第一個參數應該是其中所有fds的最大值,再加上一個。