我向两个客户发送消息并等待他们两个回复。 我必须检索首先回答的套接字的SOCKET值,但select只返回1,0或-1。如何编辑我的代码以便获得该值?
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(actionGuy, &readSet);
FD_SET(actionAnotherGuy, &readSet);
send(actionGuy, "go", 3, 0);
send(actionAnotherGuy, "go", 3, 0);
SOCKET first = select(actionGuy + 1, &readSet, NULL, NULL, NULL);
答案 0 :(得分:2)
如果它们在select()
的同一调用中都变得可读,则它们在基本上同时变得可读。内核无法将它们分开:你不能。如果存在显着的间隔,则它们将在单独的select()
调用中变得可读。
答案 1 :(得分:0)
select()
出错时返回-1,超时时返回0,如果1+套接字满足等待,则返回> 0。 fd_set
会相应修改(因此每次调用fd_set
时都必须重置select()
)。您必须分析修改后的fd_set
以了解哪个套接字已准备好。
此外,在非Windows平台上,select()
的第一个参数需要是fd_set(s)
+1中的最高套接字值,但您使用的是actionGuy + 1
,这将是如果actionAnotherGuy
的值高于actionGuy
,则无效(在Windows上,忽略第一个参数)。
尝试更像这样的东西:
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(actionGuy, &readSet);
FD_SET(actionAnotherGuy, &readSet);
send(actionGuy, "go", 3, 0);
send(actionAnotherGuy, "go", 3, 0);
#ifdef MSWINDOWS
int ret = select(0, &readSet, NULL, NULL, NULL);
#else
int max_fd = max(actionGuy, actionAnotherGuy);
int ret = select(max_fd + 1, &readSet, NULL, NULL, NULL);
#endif
if (ret < 0) {
// error
}
else if (ret == 0) {
// timeout
}
else
{
// at least one socket is readable
if (FD_ISSET(actionGuy, &readSet)) {
// actionGuy is readable
}
if (FD_ISSET(actionAnotherGuy, &readSet)) {
// actionAnotherGuy is readable
}
}