0

我正在尝试在 2 台计算机上做一个 2 路广播系统。这是我第一次使用 C++ 进行网络编程。假设我有计算机 A 和计算机 B,每个声明 2 个套接字,每台计算机和客户端上的套接字 sd 和 sd1,每台计算机上的服务器声明。在计算机 A 上,计算机 A 上的套接字 sd 绑定到计算机 A 上的客户端 IP 192.168.2.100:50000。然后它使用以下方法从广播计算机 B 接收信息:

recvfrom(sd, (char *)received_buffer, 100, 0, NULL, 0)

在计算机 B 上,socket sd 设置为广播使用:

setsockopt(sd, SOL_SOCKET, SO_BROADCAST, (char *)&broadcastpermission, sizeof(struct sockaddr_in))

但由于广播使用,sd 未绑定。然后计算机 B 使用以下命令向计算机 A 广播信息:

sendto(sd, (char *)send_buffer, 100, 0, (struct sockaddr *)&server, (int)sizeof(struct sockaddr_in))

其中计算机 B 上声明的服务器的 IP 为 192.168.2.100:50000(与计算机 A 上的客户端 IP 相同,以便广播到该 IP)。

当计算机 B 向计算机 A 广播时,上述方法工作正常。但是,当我尝试反向执行相同操作时,计算机 A 向计算机 B 广播,它不起作用。在计算机 A 上,socket sd1 被声明并设置为广播使用:

setsockopt(sd1, SOL_SOCKET, SO_BROADCAST, (char *)&broadcastpermission, sizeof(struct sockaddr_in))

并且 sd1 未绑定,计算机 A 使用以下命令向计算机 B 广播:

sendto(sd1, (char *)send_buffer, 100, 0, (struct sockaddr *)&server, (int)sizeof(struct sockaddr_in))

其中服务器被声明为 IP 192.168.2.2:40000 (它是计算机 B 的客户端 IP 地址,以便在那里广播)。在计算机 B 上,socket sd1 被声明并绑定到客户端,并在 IP 192.168.2.2:40000 处自动获取 IP。计算机 B 使用以下命令接收广播:

recvfrom(sd, (char *)received_buffer, 100, 0, NULL, 0)

我为这个很长的故事道歉,但我需要尽可能清楚。谁能说出为什么计算机 B 不能从计算机 A 接收广播的任何可能性?

4

1 回答 1

0

您所描述的似乎是一种沟通方式有效,而另一种则无效。这通常与代码中的问题无关,而是与网络配置有关,通常是防火墙。

使用嗅探器(如Wireshark)验证计算机 B 是否接收到来自计算机 A 的广播 UDP 数据报。如果不是这种情况,请验证计算机 A 正在发送正确的 UDP 数据报。如果 A 正在发送但 B 没有接收,则存在网络问题(路由器、防火墙等)。如果 B 正在接收,但您的应用程序没有,请验证端口号是否正确。您可以在计算机 B 上使用netstat(带-a -n)来查看您是否在正确的端口上打开了 UDP 套接字。

如果所有这些都不能让您更接近,请尝试在两台计算机上运行完全相同的程序 - 这意味着不要交换sdandsd1角色。相反,在两台计算机上运行相同的程序(和相同的二进制文件,如果可能的话),用嗅探器验证数据报是否被正确接收。然后您可以查看程序是否可以相互接收。如果是这种情况,那么程序 B 代码中可能存在一些疏忽,导致其发生故障。

最后,用于ping验证基本的双向通信,通过从另一台计算机 ping 每台计算机(请注意,这ping并不能确认有效的双向路径 - 防火墙通常会阻止传入的回显请求,但不会阻止回复)。然后使用常规(非广播)UDP 套接字来验证 UDP 通信。可能允许单播,但不允许广播。

于 2011-07-27T06:39:47.040 回答