作为简单网络项目的一部分,我正在尝试将两台计算机连接在一起以发送简单的数据包。客户端使用广播来查找服务器,我的服务器成功地从客户端检测到此广播。
服务器然后发送回复数据包,但是我无法让客户端收听数据包。
问题似乎在于广播方法,因为如果我使用直接服务器连接,而不是INADDR_BROADCAST我指定IP地址127.0.0.1或192.168.0.x然后服务器连接,发送回复,并且客户收到它。
客户端中的监听代码:
// 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函数,没有任何错误返回。
我还尝试创建第二个套接字,仅用于侦听同一端口,但这与服务器冲突,因此无法打开。
基本上,我想问的问题是:如何让客户端收听广播的回复? - 也就是说服务器地址最初是未知的,我正在尝试使用回复地址创建一个新的套接字,但是我没有从广播中获得回复地址,尽管服务器接收到广播并且肯定会发送回复。 / p>
答案 0 :(得分:0)
正如您所指出的那样,当您与INADDR_BROADCAST
绑定时,您将不会收到任何回复。这是正常的:当您绑定到地址时,您只接收来自该地址的数据包。您根本不需要将套接字绑定到任何地址。连接套接字(即TCP)通常需要此操作。如果接收套接字工作,我想这是因为你在同一台机器上进行所有测试。
如果您想接收来自指定地址的数据包,可以尝试使用connect
或sendto
和receivefrom
。