据this page:Winsock2 select():在同一个套接字上可能有多个事件?
select函数返回插座总数处理该 已经准备就绪,包含在FD_SET结构。
是否thereotically可能的返回值大于1,如果我只添加一个(下同)SOCKET
到每个FD_SET
S和它们传递到select
?这意味着我必须在同一个套接字上处理多个事件。例如:
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
@SergeyA - 如果我在每个'select'后测试它并得到'total <= 1',这并不意味着'total> 1'永远不会发生。另外,我并不认为抓住一个'select'会很容易,它会返回一个('readfds'或'writefds')和一个'exceptfds',它们使用相同的套接字。无论如何,我希望我错了,我会试着去测试它。 –
有一种简单的测试方法。只需获得可写入和读取的相同套接字并将其置于选中状态即可。看看你有什么。 – SergeyA