《windows网络编程》上有这样一个例子:
select的函数原型:
int select {
int nfds; // 该参数被忽略,兼容早期Berkeley套接字应用程序,在Unix下是该参数代表监控最大的套接字数加1
fd_set FAR * readfds; // 检查可读性
fd_set FAR * writefds; // 检查可写性
fd_set FAR * exceptfds; // 用于带外数据
const struct timeval FAR * timeout // 超时设置
}; // 从根本上说,fdset数据类型代表着一系列特定套接字的集合
readfds集合包括符合下述任何一个条件的套接字:
■ 有数据可以读入。
■ 连接已经关闭、重设或中止。
■ 假如已调用了listen,而且一个连接正在建立,那么accept函数调用会成功。
writefds集合包括符合下述任何一个条件的套接字:
■ 有数据可以发出。
■ 如果已完成了对一个非锁定连接调用的处理,连接就会成功。
看到网上有这样的代码:
FD_ZERO(&readfd);
FD_ZERO(&writefd);
FD_SET((UINT)fd1, &readfd);
FD_SET((UINT)fd1, &writefd);
FD_SET((UINT)fd2, &writefd);
FD_SET((UINT)fd2, &readfd);
select(maxfd,&readfd,&writefd,NULL,×et);
if(FD_ISSET(fd1, &readfd))
{
}
if(FD_ISSET(fd2, &writefd))
{
}
然后FD_ISSET(fd2, &writefd)这个有困惑,这个是怎么判断套接字有数据要写的?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)