日期:2014-05-18  浏览次数:20861 次

C# ,还是UDP的问题,关于UDP常连接问题

请教一个,UDP,是不是常连接的?

 首先,假设我的PC通过UDP向设备发送命令包,是一问一答式

  如下:
  发送一次命令,等待接收并处理 
 
C# code
 udp.Connect(ip, Port);
            udp.Send(Cmd , len);
            byte[] receive = new byte[256];
            return UdpReceiveData(ip, Port);   



 问题1 : 是不是,发送一次发一次,都要在发送时,都需要connect一次远端的设备?

 问题2: 如果我发一个命令,让设备主动向PC发送数据(当发送停止命令,才停止向PC发送数据)
  我是不是开个线程,一直接受就可以了?


   


------解决方案--------------------
1、不用每次都连接,实际上UDP根本不连接也可以。
2、对。
------解决方案--------------------
UDP本身是不需要连接的,.net给UDP套接字提供connect方法,是为了简化收发时的操作。假如本机只接受一个远程UDP套接字发来的数据,并且只发送给那个远程套接字数据,就可以先connect。
正常情况下,应该使用Socket.SendTO来发送,Socket.ReceiveFrom来接收,不需要事先connect。
------解决方案--------------------
同意楼上的。
另在你另一个贴我不是说过了吗,如果要能一直接收到数据,要么采用异步接收(beginReceive),要么自己开线程在循环里接收。

------解决方案--------------------
继续搬上msdn的例子
C# code
public static bool messageReceived = false;

public static void ReceiveCallback(IAsyncResult ar)
{
  UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
  IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;

  Byte[] receiveBytes = u.EndReceive(ar, ref e);
  string receiveString = Encoding.ASCII.GetString(receiveBytes);

  Console.WriteLine("Received: {0}", receiveString);
  messageReceived = true;
}

public static void ReceiveMessages()
{
  // Receive a message and write it to the console.
  IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort);
  UdpClient u = new UdpClient(e);

  UdpState s = new UdpState();
  s.e = e;
  s.u = u;

  Console.WriteLine("listening for messages");
  u.BeginReceive(new AsyncCallback(ReceiveCallback), s);

  // Do some work while we wait for a message. For this example,
  // we'll just sleep
  while (!messageReceived)
  {
    Thread.Sleep(100);
  }
}