用PHP发送UDP广播并在C#中接收

3

我正在尝试向一个C#应用程序发送广播UDP消息。我尝试了以下代码来发送消息,该代码是在php.net网站上作为评论发布在socket_sendto手册页面上的。

<?php 
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); 
socket_sendto($sock, $broadcast_string, strlen($broadcast_string), 0, '255.255.255.255', $port); 
?>

这对我没有用,也许是我的网络问题。

但是如果我将广播IP '255.255.255.255' 替换为我的特定IP(例如'192.168.1.128'),它就能正常工作。我可以在Wireshark中看到这条消息,而使用上面的代码则看不到。这导致我认为代码的PHP端存在问题。我真的想在程序中使用广播或某种多播方式,所以我现在有点困扰;)

我在接收端(C#)使用以下代码进行测试:

UdpClient subscriber = new UdpClient(15000);

IPEndPoint ep = new IPEndPoint(IPAddress.Any, 15000); ;

byte[] pdata = subscriber.Receive(ref ep);
string data = Encoding.ASCII.GetString(pdata);
MessageBox.Show(data);
subscriber.Close();

有任何想法是什么导致了这个问题?

这里可以工作。socket_sendto 的返回值是什么? - Artefacto
已经解决了。我猜当 PHP 服务器的 IP 地址在 LAN 范围内,例如 192.168.1.*,子网掩码为 255.255.255.0 时,我无法将 UDP 数据包发送到 255.255.255.255 范围。为了解决这个问题,我将数据包发送到 192.169.1.255 范围。仍然欢迎回答为什么会出现这种情况的解释 ;) - Bravoman
@Artefacto 再试一次,只是为了好玩... 发送到 255.255.255.255 的返回值是一个正整数,尽管 UPD 数据包没有到达我的客户端电脑。 - Bravoman
请注意,我在上面的一条消息中打错了一个字。范围显然应该是192.168.1.255而不是192.169 ;) - Bravoman
2个回答

1

255.255.255.255 是“有限制”的广播,而你的 192.168.1.255 是“定向”的广播。 有限制的意思是它只在局域网内发送。局域网由直接连接的主机定义,即没有路由器介入。路由器——除了少数例外——不会传递有限制的广播,而是传递定向广播。

现在,针对你的初始问题和疑问,我只能猜测你正在通过路由器发送广播。


1
尝试在您的脚本中指定MSG_DONTROUTE标志。如果没有指定,则路由器将决定是否广播您的消息,可以从CodeGuru post中获得灵感。
socket_sendto($sock, $broadcast_string, strlen($broadcast_string), MSG_DONTROUTE, '255.255.255.255', $port);

我已经阅读了CodeGuru上的帖子,我必须说这是解决我最初问题的方法。谢谢!目前仍在使用这个解决方案,所以我还没有测试过它。 - Bravoman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接