2路udp广播问题,borland turbo C ++

时间:2011-07-27 06:20:20

标签: c++ client udp broadcasting

我正在尝试在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上,声明套接字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))

其中server被声明为IP 192.168.2.2:40000(它是计算机B的客户端IP地址,因此它在那里广播)。在计算机B上,套接字sd1被声明并绑定到客户端,并在IP 192.168.2.2:40000自动获得IP。计算机B使用以下方式接收广播:

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

我对这个漫长的故事充满了热情,但我需要尽可能清楚。谁能说出为什么计算机B无法接收来自计算机A的广播?

1 个答案:

答案 0 :(得分:0)

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

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

如果所有这些都不能让您靠近,请尝试在两台计算机上运行完全相同的程序 - 这意味着不要交换sdsd1角色。而是在两台计算机上运行相同的程序(如果可能的话,使用相同的二进制文件),使用嗅探器验证是否正确接收了数据报。然后你可以看到程序是否可以互相接收。如果是这种情况,那么程序B代码可能会出现一些导致其出现故障的问题。

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