2013-02-27 66 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