如何收听广播中的服务器回复
How to listen for a server reply from broadcast?
作为一个简单网络项目的一部分,我试图将两台计算机连接在一起,以发送一个简单的数据包。客户端使用广播来查找服务器,而我的服务器成功地从客户端检测到了此广播。
然后服务器发送一个回复数据包,但是我无法让客户端监听该数据包。
问题似乎出在广播方法上,因为如果我使用直接服务器连接,也就是说,我指定IP地址127.0.0.1或192.168.0.x,而不是INADDR_BROADCAST,那么服务器连接,发送回复,客户端接收。
客户端中的侦听代码:
// Stop the client from waiting for packets if there are none.
fd_set checksockets;
checksockets.fd_count = 1;
checksockets.fd_array[0]=m_listenSocket;
struct timeval t;
t.tv_sec=0;
t.tv_usec=0;
int waiting = select(NULL, &checksockets, NULL, NULL, &t);
// If there is at least one packet receive it.
if(waiting>0) {
std::cout << "Packet received.n";
}
从这一点开始,我尝试使用recvfrom()方法查找服务器地址。
我已经确保在创建客户端套接字后立即在其上使用广播标志。这不会返回任何错误。
int value=true;
int result = setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&value, sizeof( value ) );
我已经检查了我使用过的所有可能的WINSOCK函数,没有一个返回任何错误。
我还尝试创建第二个套接字,仅用于在同一端口上侦听,但这与服务器冲突,因此无法打开。
所以,本质上,我想问的是:我如何让客户收听广播的回复?-也就是说,服务器地址一开始是未知的,我试图使用回复地址创建一个新的套接字,但我没有从广播中获得回复地址,尽管服务器接收到广播并肯定发送了回复。
正如您所指出的,当绑定到INADDR_BROADCAST
时,您不会收到任何返回。这是正常的:当你绑定到一个地址时,你只会收到来自该地址的数据包。您根本不需要将套接字绑定到任何地址。连接的套接字(即TCP)通常需要此操作。如果接收套接字有效,我想这是因为你在同一台机器上进行所有测试。
如果您想从给定地址接收数据包,可以尝试使用connect
或sendto
和receivefrom
。
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 从服务器传输到客户端的消息不会出现
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- OpenSSL TLS服务器-使用客户端证书白名单
- 我正在开发服务器,ip作为参数传递不起作用
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 如何在 Minecraft 服务器上执行命令
- 调试编译的服务器在数据库打开时崩溃
- C++套接字客户端到 Python 服务器未创建连接
- UDP 服务器无法发送回复,发送返回 -1,errno 为 22
- ZeroMQ Hello World Client - Server.来自服务器的回复显然没有到达
- 为什么我的服务器没有等待接收来自客户端的回复
- 使用 select() 的请求/回复服务器。无法写回客户端
- Winsock:回显服务器回复两次,当时我刚刚将其编程为执行一次send()调用
- 如何收听广播中的服务器回复
- C套接字:回显服务器错误的回复