Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 使用select()检查套接字-Winsock_Sockets_Winsock - Fatal编程技术网

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()

  • 返回1
  • 保持
    fd_count
    (集合中的套接字数)不变
  • 使
    fd_数组
    (集合中的套接字数组)保持不变
  • 如果客户端未向该套接字发送任何数据
    select()

  • 返回0
  • 将fd_计数减少到0
  • 保持
    fd_数组
    不变
  • 如果我再次调用select(),而客户端再次未发送任何数据:

  • 返回-1(我认为这是因为
    fd\u计数
    value-0)
  • 我想我错过了一些重要的规则select()是如何工作的,这个函数做了什么,但我无法理解。 下面是一些代码片段,演示如何调用select():

    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()