带有空集的select()的返回值

时间:2013-02-27 10:19:24

标签: c

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

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

2 个答案:

答案 0 :(得分:3)

它会正常工作。

manual page for Linux州:

  

有些代码调用select(),其中所有三个集都为空,nfds为零,非NULL超时作为一种相当便携的方式以亚秒级精度进行休眠。

所以,使用空集并不奇怪。集合可以为空,这是其定义的一部分。是的,你必须传递0,因为你应该传递超过最大描述符的一个。

我建议您为需要添加描述符的各方定义API:

int add_fds(FD_SET *set);

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

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

  

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

答案 1 :(得分: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.