【发布时间】:2014-08-11 03:56:40
【问题描述】:
我一直在探索函数select() 以检查是否有一些套接字已准备好读取,我必须承认我有点困惑。 MSDN 说“选择函数返回准备就绪并包含在fd_set 结构中的套接字句柄的总数”。
假设我有 3 个套接字并且 2 个套接字已准备就绪,select() 返回 2,但这没有告诉我这 3 个套接字中的哪两个已准备好读取,那么我该如何检查呢?
所以我在我的程序中设置了断点来跟踪我的fd_set 结构。我意识到的是(fd_set 中只有一个套接字):如果套接字已准备好读取 select():
- 返回 1
- 保持
fd_count(集合中的套接字数量)不变 - 保持
fd_array(集合中的一组套接字。)保持不变
如果客户端没有发送任何寻址到该套接字select()的数据:
- 返回 0
- 将
fd_count减少到 0 - 保持
fd_array不变
如果我再次调用 select() 并且客户端再次没有发送数据:
- return -1 (我认为这是因为
fd_count值 - 0)
我想我错过了一些关键规则 select() 的工作原理以及此函数的作用,但我无法弄清楚。 这是一些代码 sn-p 来显示我调用 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);
在select()调用之后,当没有可以读取的套接字时,fd_array不应该填充0值吗?
【问题讨论】: