UDP代码疑难解答

时间:2012-11-05 00:26:12

标签: c# java android udp wireshark

我正在研究一个系统,以便在网络上的对等体之间发送数据。一个应用程序是用Java编写的Android版本。另一个应用程序是在PC上用C#编写的。

我在Android上用Java编写代码来发送UDP数据报。我写了C#代码来发送和接收数据报。我试图将消息从Android发送到PC。我可以在WireShark中看到该消息,但不能在我的程序中看到。所以,我把我的程序放在第二台PC上。我成功地将PC上的消息发送到第二个消息。但是,当我试图从seond PC发送消息回到我的时候,它失败了。我可以在我的电脑上的WireShark中看到它,但不是我的应用程序。我不知道接下来要尝试什么。你有什么建议吗?为什么UDP数据包在WireShark中可见而在我的应用程序中不可见?

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 个答案:

答案 0 :(得分:1)

如果我的程序在特定的PC上运行时(我们称之为“Windows1”),我理解问题是正确的,它永远不会收到UDP数据包。它不会从Java Android或在不同PC上运行的C#代码接收它们(我们称之为“Windows2”)。

但是,当您在“Windows2”上运行程序时,它会从“Windows1”接收消息。听起来你在“Windows1”上启用了防火墙并且没有UDP端口50005的例外。在“Windows2”上你的防火墙被关闭或50005的例外,这就是它从“Windows1”接收消息的原因。 / p>

请注意,由于UDP不是面向连接的,因此防火墙错误不会导致通常的连接超时错误。消息刚刚丢弃,您永远不会收到错误。