我正在尝试向C#应用程序发送广播UDP消息。我尝试了以下代码来发送消息。我在php.net网站上找到a comment的socket_sendto manual page。
<?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();
任何想法可能是什么原因?
答案 0 :(得分:1)
255.255.255.255是“有限”广播,而您的192.168.1.255是“定向”广播。 简单限制意味着它仅在LAN内发送。 LAN由直接连接的主机定义,即中间没有路由器。路由器 - 除了少数例外 - 不通过有限广播而是通过定向广播。
现在,有了您最初的问题和疑问,我只能猜测您是通过路由器发送广播。
答案 1 :(得分:1)
尝试在脚本中指定MSG_DONTROUTE
标志。从这个CodeGuru post中获取灵感,如果没有指定,路由器会决定是否广播你的消息。
socket_sendto($sock, $broadcast_string, strlen($broadcast_string), MSG_DONTROUTE, '255.255.255.255', $port);