C++检查哪个插槽首先应答

Checking which socket answered first C++

本文关键字:应答 插槽 检查 C++      更新时间:2023-10-16

我正在向两个客户端发送消息并等待它们都响应。我必须检索首先回答但选择仅返回 1,0 或 -1 的套接字的 SOCKET 值。如何编辑我的代码以便获取该值?

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);

如果它们在同一个select()调用中变得可读,它们基本上同时变得可读。内核无法将它们分开:你不能。如果间隔很长,它们将在单独的select()调用中变得可读。

select()错误

时返回 -1,超时时返回 0,如果 1+ 套接字满足等待,则返回>0。 fd_set会相应地修改(因此每次调用select()时都必须重置fd_set(。 您必须分析修改后的fd_set才能知道哪些套接字已准备就绪。

此外,在非 Windows 平台上,select() 的第一个参数必须是 +1 fd_set(s)中最高的套接字值,但您使用的是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
    }
}