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

时间:2011-07-11 13:22:15

标签: c# php udp broadcast lan

我正在尝试向C#应用程序发送广播UDP消息。我尝试了以下代码来发送消息。我在php.net网站上找到a commentsocket_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();

任何想法可能是什么原因?

2 个答案:

答案 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);