2011-07-11 130 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由直接連接的主機定義,即兩者之間沒有路由器。路由器 - 除少數例外 - 不通過有限的廣播,而是通過定向廣播。

現在,隨着你最初的問題和問題,我只能猜測你是通過路由器發送你的廣播。