2012-11-05 119 views
1

我正在使用一個系統在網絡上的對等點之間發送數據。一個應用程序是用Java編寫的Android應用程序。另一個應用程序是用C#編寫的。排除UDP代碼故障

我在Android上用Java編寫代碼來發送UDP數據報。我寫了C#代碼來發送和接收數據報。我試圖從Android向PC發送消息。我可以在WireShark中看到該消息,但不能在我的程序中看到。所以,我把我的程序放在第二臺PC上。我成功地從我的電腦發送消息到第二個消息。但是當我試圖從seond電腦發送消息回到我的失敗。我可以在我的PC上看到WireShark,但不是我的應用程序。我不知道接下來要嘗試什麼。你有什麼建議嗎?爲什麼在WireShark中可以看到UDP數據包,但不是我的應用程序?

Here is my code. 

//C# code on PC 
//Sender 
sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, rotocolType.Udp); 
send_to_address = IPAddress.Parse(strIPAddress); 
sending_end_point = new IPEndPoint(send_to_address, intPort); 
sending_socket.EnableBroadcast = true; 
byte[] bytMessage = Encoding.ASCII.GetBytes(strMessage); 
sending_socket.SendTo(bytMessage, sending_end_point); 



//Listener 
UdpClient listener = new UdpClient(listenPort); 
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); 
byte[] bytReceiveDataByteArray; 
try 
{ 
    listener.EnableBroadcast = true; 

    while (isRunning) 
    { 
     //listen for data from sender 
     bytReceiveDataByteArray = listener.Receive(ref groupEP); 
     //Fire an event to send the data to the hosting code 
     if (DataReceived != null) 
     { 
     DataReceivedEventArgs e = new DataReceivedEventArgs(bytReceiveDataByteArray); 
     DataReceived(this, e); 
     } 
    } 
} 


//Java code on Android 
DatagramSocket socket = new DatagramSocket(); 
InetAddress serverIP = InetAddress.getByName(strIpAddress); 
byte[] outData = (strMsg).getBytes(); 
DatagramPacket out = new DatagramPacket(outData,outData.length, serverIP,50005); 
socket.send(out); 
socket.close(); 

感謝,

邁克

+1

你爲什麼要用UDP? UDP不會執行數據包錯誤控制。你必須自己確定你的數據包是有序的,沒有被刪除或重複。你有兩個以上的同伴嗎?我建議您使用TCP,如果它不會對您的應用程序性能產生任何影響。 – Frank

+0

我很害怕。這是一款Wii類型的視頻遊戲。遊戲在PC上運行,Android用於控制器。 PC將圖像發送到Android。 Android會將加速計信息發送回PC。 – Mikutus

回答

1

如果我理解正確的問題,當你的程序中的特定PC上運行(可以稱之爲「Windows1」)不會接收UDP數據包。它不會從Java Android或從另一臺PC上運行的C#代碼(可以稱之爲「Windows2」)接收它們。

但是,當您在「Windows2」上運行程序時,它會接收來自「Windows1」的消息。聽起來您的防火牆在「Windows1」上啓用了防火牆,並且沒有UDP端口50005的例外。在「Windows2」上,您的防火牆已關閉,或者50005發生異常,這就是它接收來自「Windows1」的消息的原因。

請注意,由於UDP不是面向連接的,因此防火牆錯誤不會導致通常的連接超時錯誤。這些消息只是被刪除,你永遠不會得到一個錯誤。

+0

謝謝!這給了我一些檢查。我確實有一個問題。如果防火牆正在阻止它,WireShark如何看到它? – Mikutus

+0

我爲該UDP端口的防火牆添加了一條規則。現在我可以在Windows1和Windows2之間來回發送消息。該部分功能完備。但是,我仍然無法從Android獲取數據包。我甚至試圖徹底關閉防火牆,但他們仍然不會通過。我知道數據包正在通過,因爲我可以在Windows1上用WireShark看到它。但是,由於某種原因,我的C#應用​​程序仍然無法看到它。再次感謝。 – Mikutus

+0

好的。現在我有Android代碼工作。我的問題是,我忘記了我原來的代碼有硬編碼的端口號。你甚至在你的回覆中提到了兩次端口號,我仍然沒有想過。 – Mikutus