C++检查哪个插槽首先应答
Checking which socket answered first C++
我正在向两个客户端发送消息并等待它们都响应。我必须检索首先回答但选择仅返回 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
}
}
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- Qt插槽调用了两次
- C++Qt信号和插槽
- 从插槽调用 QApplication::p rocessEvents 会导致再次调用同一插槽
- C++检查哪个插槽首先应答