2013-02-27 63 views
2

我有一位客戶,這增加了插座FD對FD_SET,並在後面的代碼我想使用select()機制對這個FD_SET我有。 如果「大師」的fd_set不包含任何項目都,什麼是選擇的返回值()?什麼是我的「fdmax」參數? 0?的選擇()與空套返回值

我需要處理這種情況下,在我的組實際上是空的。我只是想知道,如果可能隱含地處理它,沒有專櫃+如果{}

回答

3

它會工作得很好。

manual page for Linux狀態:

一些代碼調用select()與所有三套空,NFDS零,一個非空超時一個相當簡便的方式與亞秒級精確睡覺。

所以,沒有什麼奇怪的,使用空套。集合可以是空的,這是它們定義的一部分。是的,你必須通過0,因爲你應該通過一個比最大的描述符。

我建議定義您的API需要添加描述符,像這樣方:

int add_fds(FD_SET *set); 

,並讓他們返回1 +(加最大的描述符),如果沒有則爲0加入按以上。

返回值將可能是0,該手冊頁說:

成功時,選擇()和PSELECT()返回包含在三個返回的描述符集的文件描述符的數量(即,在readfds,writefds中設置的位的總數(除了fds),如果在發生任何有趣的事情之前超時到期,這些位可能爲零。

+0

或用不同的詞,當集是空也返回值將爲零。感謝 – buddy123 2013-02-27 10:58:26

+0

返回值可以是零(超時)或-1(出錯,如中斷的系統調用,您應該處理) – wildplasser 2013-02-27 11:00:54

+0

沒有給出(使用空)超時是可以安全地說,如果select返回0,它意味着select()的所有給定fd_sets都是空的? – buddy123 2013-02-27 11:02:10

0
when u try to connect server-side, server must to accept this connect with serverfd or what ever u want to say it. Then server after the accept conneciton u, will use FD_SET(new_client_fd, &readfds). At last u will check with the FDISSET(new_client_fd, &readfds). If return true u can read the socket. 

Client side after the connect(...,...,..), u can use again select. Such as 

client_read_fd = connect(...,...,.. server info) 
maxfd = client_read_fd +1 
int a=select(maxfd, &readfds,null,null.....) 

a shows u how many fds are 1 so ready to read. 
+0

這將是很好避免短信俚語(如「U」,而不是你) – luca 2016-08-02 12:50:39

+0

S.O.沒有140個字符限制:) – 2016-08-02 12:51:10