我一直在探索函数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()
:
fd_count
(集合中的套接字数量)未触动fd_array
(集合中的套接字数组。)未触动如果客户端没有发送任何寻址到该套接字select()
的数据:
fd_count
减少为0 fd_array
未触及如果我再次调用select()并且客户端再次没有发送数据:
fd_count
值 - 0)我想我错过了一些关键的规则,如何使用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值?