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); }}