使用select() - Winsock检查套接字

时间:2014-06-20 11:42:44

标签: sockets winsock

我一直在探索函数select()来检查是否有一些套接字可以读取,我必须承认我有点困惑。 MSDN说“select函数返回已准备好并包含在fd_set结构中的套接字句柄总数”。

假设我有3个插槽且2个插槽准备就绪,select()返回2,但是这没有给出任何信息,这3个插槽中有2个已准备好读取,所以我该如何检查它?

在堆栈溢出时,我遇到了这个:When select returns, it has updated the sets to show which file descriptors have become ready for read/write/exception

所以我在程序中放置了断点来跟踪我的fd_set结构。我已经意识到(只有fd_set中的一个套接字):如果套接字已准备好阅读select()

  1. 返回1
  2. 离开fd_count(集合中的套接字数量)未触动
  3. 离开fd_array(集合中的套接字数组。)未触动
  4. 如果客户端没有发送任何寻址到该套接字select()的数据:

    1. 返回0
    2. fd_count减少为0
    3. 离开fd_array未触及
    4. 如果我再次调用select()并且客户端再次没有发送数据:

      1. 返回-1(我认为这是因为fd_count值 - 0)
      2. 我想我错过了一些关键的规则,如何使用select()和这个函数做什么,但我无法弄明白。 这是一些代码片段,用于显示我要调用select()的代码:

        CServer::CServer(char *ipAddress,short int portNumber)
        {   // Creating socket
            ServerSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
            if (ServerSocket == INVALID_SOCKET) 
                std::cout << "I was not able to create  ServerSocket\n";
            else 
                std::cout << "ServerSocket created successfully\n";
        
            // Initialization of ServerSocket Address
            ServerSocketAddress.sin_family = AF_INET;
            ServerSocketAddress.sin_addr.S_un.S_addr = inet_addr(ipAddress);
            ServerSocketAddress.sin_port = htons(portNumber);
            // Binding ServerSocket to ServerSocket Address
            if (bind(ServerSocket, (SOCKADDR*)&ServerSocketAddress, sizeof(ServerSocketAddress)) == 0) 
                std::cout << "Binding ServersSocket and ServerSocketAddress ended with success\n";
            else 
                std::cout << "There were problems with binding ServerSocket and ServerSocket Address\n";
        
            // Initialization of the set of sockets
            ServerSet.fd_count = 1;
            ServerSet.fd_array[0] = ServerSocket;
        }
        

        主要:

        CServer Server(IP_LOOPBACK_ADDRESS, 500);
        tmp = select(0, &Server.ServerSet, NULL, NULL, &TimeOut);
        

        fd_array调用之后,当没有可以读取的套接字时,select()是否应该填充0值?

1 个答案:

答案 0 :(得分:0)

您可以假设使用FD_SET宏和朋友。你不是那样做的。