Example #1
0
	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;
	}
Example #2
0
	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();

	}