我有一个客户端,它将套接字fd添加到FD_SET,稍后在代码中我想在这个FD_SET上使用select()机制。 如果“master”fd_set根本不包含任何项,那么select()的返回值是多少?我的“fdmax”参数是什么? 0?
我需要处理这样的情况,我的集合实际上是空的..我只是想知道它是否可以隐式处理它,没有特殊的计数器+ if {}
答案 0 :(得分:3)
它会正常工作。
有些代码调用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.