2

我有一个将套接字 fd 添加到 FD_SET 的客户端,稍后在代码中我想在我拥有的这个 FD_SET 上使用 select() 机制。如果“master” fd_set 根本不包含任何项目,那么 select() 的返回值是多少?我的“fdmax”参数是什么?0?

我需要处理这种情况,我的集合实际上是空的。我只是想知道是否可以隐式处理它,没有特殊的计数器 + if { }

4

2 回答 2

3

它会工作得很好。

Linux的手册页指出:

一些代码调用 select() 时所有三个集合都为空,nfds 为零,并且非 NULL 超时作为一种相当可移植的亚秒精度睡眠方式。

因此,使用空集并没有什么奇怪的。集合可以是空的,这是它们定义的一部分。是的,你必须传递 0,因为你应该传递比最大描述符多 1 的值。

我建议为需要添加描述符的各方定义您的 API,如下所示:

int add_fds(FD_SET *set);

并让它们返回 1 +(添加的最大描述符),如果没有按上述添加,则返回 0。

返回值可能为 0,手册页说:

成功时,select() 和 pselect() 返回包含在三个返回的描述符集中的文件描述符的数量(即 readfds、writefds、exceptfds 中设置的总位数)如果超时过期可能为零在任何有趣的事情发生之前。

于 2013-02-27T10:41:04.490 回答
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.
于 2016-08-02T12:12:15.037 回答