public void ReceiverThreadMain() { DATAGRAM datagram=new DATAGRAM(); int datagram_size = datagram.BinarySize(); EndPoint remote = new IPEndPoint(IPAddress.Any, 0); byte[] data = new byte[datagram_size]; BinaryReader reader = new BinaryReader(new MemoryStream(data)); while (Run) { try { udpClient.Client.ReceiveFrom(data, ref remote); reader.BaseStream.Position=0; if(!(remote as IPEndPoint).Address.Equals(expectedRemote.Address)) { Debug.Log("Ignoring packet from " + remote); continue; } } catch(SocketException) { //Debug.LogError(e.ToString()); break; } catch(ObjectDisposedException) { //socket was closed //Debug.LogError(e.ToString()); Run = false; break; } //gather server stats if(lastPacketTimeUs==0) //first packet case lastPacketTimeUs=Timestamp.TimestampUs(); else UpdatePacketFrequencyStatistics(); //process datagram datagram.FromBinary(reader); onDatagram(datagram); if (dumpWriter != null) dumpWriter.Write(data); } reader.Close(); if(dumpWriter!=null) dumpWriter.Close(); onDatagram = null; }
public void Start(DatagramHandler<DATAGRAM> datagramFunction) { if (recvThread != null) throw new InvalidOperationException("UDP Server is already running"); if (datagramFunction == null) throw new InvalidOperationException("No DatagramHandler specified, can't start processing thread"); onDatagram = datagramFunction; recvThread = new Thread(new ThreadStart(ReceiverThreadMain)); Run = true; recvThread.Start(); }