2011-07-11 180 views
3

我试图发送一个广播UDP消息到C#应用程序。我已经尝试了下面的代码来发送消息。我在php.net网站上找到a commentsocket_sendto manual pageUDP广播发送从PHP和接收C#

<?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

在这里工作。 'socket_sendto'的返回值是什么? – Artefacto

+0

修复了这一切。我想我无法将UDP包发送到'255.255.255.255'范围内,而php服务器的ip地址在LAN范围内,例如'192.168.1。*'子网掩码为'255.255.255.0'。为了解决这个问题,我把包发送到'192.169.1.255'范围。解释为什么这实际上是这样的情况仍然欢迎虽然;) – Bravoman

+0

@Artefacto再次尝试只是踢...返回值为'255.255.255.255'是一个正整数,即使UPD数据包没有达到我的客户端电脑。 – Bravoman

回答

1

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

socket_sendto($sock, $broadcast_string, strlen($broadcast_string), MSG_DONTROUTE, '255.255.255.255', $port); 
+0

正如我已阅读[CodeGuru上的文章](http://www.codeguru.com/forum/archive/index.php/ t-286258.html)我不得不说这是解决我最初的问题。谢谢!现在[解决方法](http://stackoverflow.com/questions/6650719/udp-broadcast-send-from-php-and-recieve-in-c#comment-7860084)仍然存在,所以我没有'吨测试这个呢。 – Bravoman

1

255.255.255.255是“有限”广播,而你的192.168.1.255是“定向”广播。 简单地说,它仅限于在局域网内发送。 LAN由直接连接的主机定义,即两者之间没有路由器。路由器 - 除少数例外 - 不通过有限的广播,而是通过定向广播。

现在,随着你最初的问题和问题,我只能猜测你是通过路由器发送你的广播。