如何收听广播中的服务器回复

How to listen for a server reply from broadcast?

本文关键字:服务器 回复 何收听 广播      更新时间:2023-10-16

作为一个简单网络项目的一部分,我试图将两台计算机连接在一起,以发送一个简单的数据包。客户端使用广播来查找服务器,而我的服务器成功地从客户端检测到了此广播。

然后服务器发送一个回复数据包,但是我无法让客户端监听该数据包。

问题似乎出在广播方法上,因为如果我使用直接服务器连接,也就是说,我指定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)通常需要此操作。如果接收套接字有效,我想这是因为你在同一台机器上进行所有测试。

如果您想从给定地址接收数据包,可以尝试使用connectsendtoreceivefrom