Sockets 使用select()检查套接字-Winsock
我一直在探索函数Sockets 使用select()检查套接字-Winsock,sockets,winsock,Sockets,Winsock,我一直在探索函数select(),以检查一些套接字是否准备好读取,我必须承认我有点困惑。MSDN表示“select函数返回准备就绪并包含在fd_集合结构中的套接字句柄总数” 假设我有3个套接字,2个套接字已准备就绪,select()返回2,但这并没有告诉我这3个套接字中的哪2个已准备就绪,因此如何检查它 在堆栈溢出时,我遇到了以下问题: 所以我在程序中设置断点来跟踪我的fd\u集结构。我意识到的是(在fd\u集合中只有一个套接字):如果套接字准备好读取select(): 返回1 保持fd_cou
select()
,以检查一些套接字是否准备好读取,我必须承认我有点困惑。MSDN表示“select函数返回准备就绪并包含在fd_集合
结构中的套接字句柄总数”
假设我有3个套接字,2个套接字已准备就绪,select()
返回2,但这并没有告诉我这3个套接字中的哪2个已准备就绪,因此如何检查它
在堆栈溢出时,我遇到了以下问题:
所以我在程序中设置断点来跟踪我的fd\u集
结构。我意识到的是(在fd\u集合中只有一个套接字)
:如果套接字准备好读取select()
:
fd_count
(集合中的套接字数)不变fd_数组
(集合中的套接字数组)保持不变select()
:
fd_数组
不变fd\u计数
value-0)CServer::csserver(char*ipAddress,短int端口号)
{//正在创建套接字
ServerSocket=socket(AF_INET、SOCK_DGRAM、IPPROTO_UDP);
if(ServerSocket==无效的\u套接字)
std::cout您应该使用宏和friends。您没有这样做。将:ServerSet.fd_count=1;ServerSet.fd_array[0]=ServerSocket;替换为fd_ZERO(&Server.ServerSet);fd_SET(Server.ServerSocket,&Server.ServerSet);调用select()时不会更改任何内容按我上面提到的顺序调用了3次。假设在循环中每次都调用它。select()以破坏性方式使用它。每次在select()之前调用它时,都会调用它。如果我在fd_集合和select()中有两个套接字返回1我应该如何知道哪个套接字已准备好读取?fd_数组中仍然有2个文件描述符。Ok fd_ISSET工作,但如何!?。假设我有:fd_set myset;fd_set(socket1,&myset);fd_set(socket2,&myset);然后在调试器的本地窗口中我可以看到:myset.fd_count=2,myset.fd_数组[0]=124,myset.fd_数组[1]=136;。调用select()后,我可以看到myset.fd_count=1,myset.fd_数组[0]=124,myset.fd_数组[1]=136;。但是当我调用fd_ISSET(Socket1,&myset)时,我得到非零值,当我调用fd_ISSET(Socket2,&myset)时我得到了0值。我的问题是:如果只有myset.fd_计数值发生了变化,怎么可能?fd_数组
和fd_计数值
发生了变化,以反映满足哪些套接字要求select()
select()
只是没有清除不包含在fd\u count
中的数组插槽。这是代码不应该关心的实现细节。fd\u ISSET()
将fd\u count
考虑在内。在调用select()之前,需要为放入数组的每个套接字调用fd\u ISSET()
。