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();

知道这可能是什么原因吗?

4

2 回答 2

1

255.255.255.255 是“有限”广播,而您的 192.168.1.255 是“定向”广播。限制简单来说就是只在局域网内发送。LAN 由直接连接的主机定义,即中间没有路由器。路由器——除了少数例外——不通过有限广播,而是通过定向广播。

现在,有了您最初的问题和疑问,我只能猜测您正在通过路由器发送广播。

于 2011-07-11T15:27:23.903 回答
1

尝试MSG_DONTROUTE在脚本中指定标志。从这个CodeGuru 帖子中获取灵感,如果未指定,路由器将决定是否广播您的消息。

socket_sendto($sock, $broadcast_string, strlen($broadcast_string), MSG_DONTROUTE, '255.255.255.255', $port);
于 2011-07-11T17:08:57.010 回答