检查哪个套接字首先回答C ++

时间:2014-12-19 21:33:29

标签: c++ sockets select

我向两个客户发送消息并等待他们两个回复。 我必须检索首先回答的套接字的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);

2 个答案:

答案 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
    }
}