【发布时间】:2017-08-10 18:03:57
【问题描述】:
根据this page:
select 函数返回套接字句柄的总数 已准备好并包含在 fd_set 结构中。
如果我在每个FD_SETs 中只添加一个(和相同的)SOCKET 并将它们传递给select,返回值是否可能大于 1?这意味着我必须在同一个套接字上处理多个事件。示例:
SOCKET someRandomSocket;
FD_SET readfds;
FD_SET writefds;
FD_SET exceptfds;
timeval timeout;
/* ...
Connecting someRandomSocket to another peer.
... */
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
FD_SET(someRandomSocket, &readfds);
FD_SET(someRandomSocket, &writefds);
FD_SET(someRandomSocket, &exceptfds);
int total = select(0, &readfds, &writefds, &exceptfds, &timeout);
/* total > 1 is possible? */
/* (FD_ISSET(someRandomSocket, &exceptfds) && (FD_ISSET(someRandomSocket, &readfds) || FD_ISSET(someRandomSocket, &writefds)) == true) possible? */
还有一个问题:是否有可能发生我必须同时处理同一个套接字上的异常和非异常事件?
【问题讨论】:
-
为什么不直接测试一下?
-
@SergeyA - 如果我测试它并在每个
select之后得到total <= 1,这并不意味着total > 1永远不会发生。另外,我真的不认为捕获select会很容易,这将返回一个(readfds或writefds)和一个exceptfds,其中包含相同的套接字。无论如何,我希望我是错的,我会尝试测试它。 -
有一个简单的测试方法。只需获取可以写入和读取的相同套接字并将其放入选择中即可。看看你有什么。
标签: c++ sockets select winsock2