16    private UdpClient udpClient;
 
   18    private Thread udpThread;
 
   20    private string ControlIP;
 
   21    private List<uint> allowedStreams;
 
   22    private List<ReceiverStreamParams> receiverStreams;
 
   32      ref List<uint> allowedStreams, ref List<ReceiverStreamParams> receiverStreams)
 
   34      this.allowedStreams = allowedStreams;
 
   35      this.receiverStreams = receiverStreams;
 
   37      this.ControlIP = ControlIP;
 
   38      this.udpPort = udpPort;
 
   39      udpClient = 
new UdpClient(ControlIP, udpPort);
 
 
   54      udpThread = 
new Thread(listenForUDPData);
 
 
   63    void listenForUDPData()
 
   65      IPEndPoint ep = 
new IPEndPoint(IPAddress.Parse(ControlIP), udpPort);
 
   66      Debug.Log(
"Opening UDP Connection" + ep);
 
   70      udpClient.BeginReceive(
new AsyncCallback(UDPReceiveCallback), state);
 
   77      Debug.Log(
"Closing UDP Connection");
 
   85    void UDPReceiveCallback(IAsyncResult ar)
 
   91      UdpClient c = ((UdpState)(ar.AsyncState)).c;
 
   92      IPEndPoint e = ((UdpState)(ar.AsyncState)).e;
 
   93      byte[] buf = udpClient.EndReceive(ar, ref e);
 
   96      UdpState state = 
new UdpState(e, c);
 
   97      udpClient.BeginReceive(
new AsyncCallback(UDPReceiveCallback), state);
 
  106    void parseUDPMessage(
byte[] udpBuf)
 
  108      int headerSize = BitConverter.ToUInt16(udpBuf, 0);
 
  109      int dataSize = (int)BitConverter.ToUInt16(udpBuf, 2);
 
  110      uint streamID = (uint)BitConverter.ToUInt16(udpBuf, 4);
 
  111      int federationID = (int)BitConverter.ToUInt16(udpBuf, 6); 
 
  115      byte[] header = 
new byte[headerSize];
 
  118        Buffer.BlockCopy(udpBuf, 8, header, 0, headerSize);
 
  120      byte[] msg = 
new byte[dataSize];
 
  121      Buffer.BlockCopy(udpBuf, 8 + headerSize, msg, 0, dataSize);
 
  124      if (allowedStreams.Contains(streamID))
 
  126        for (
int i = 0; i < receiverStreams.Count; i++)
 
  128          if (receiverStreams[i].streamIDs.Contains(streamID))
 
  130            receiverStreams[i].ReceiverStream.OnMessage(streamID, header, msg);
 
  144      byte[] numByte = BitConverter.GetBytes(num);
 
  145      byte[] UDPInitMsg = constructUDPMsg(streamID, 
new byte[0], numByte);
 
  146      udpClient.Send(UDPInitMsg, UDPInitMsg.Length);
 
  148      Debug.Log(
"Sent empty receiver packet");
 
 
  162    public void send(uint streamID, 
byte[] header, 
byte[] data)
 
  164      if (udpClient == 
null) 
throw new Exception(
"udpClient undefined");
 
  168        byte[] UDPInitMsg = constructUDPMsg(streamID, header, data);
 
  169        udpClient.Send(UDPInitMsg, UDPInitMsg.Length);
 
  171      catch (SocketException socketException)
 
  173        Debug.LogException(socketException);
 
  174        throw new Exception(
"Socket exception: " + socketException);
 
 
  185    byte[] constructUDPMsg(uint streamID, 
byte[] header, 
byte[] data)
 
  187      byte[] dataPacket = 
new byte[8 + header.Length + data.Length];
 
  189      byte[] headerLengthBytes = BitConverter.GetBytes((ushort)header.Length);
 
  191      dataPacket[0] = headerLengthBytes[0];
 
  192      dataPacket[1] = headerLengthBytes[1];
 
  194      byte[] dataLengthBytes = BitConverter.GetBytes((ushort)data.Length);
 
  195      dataPacket[2] = dataLengthBytes[0];
 
  196      dataPacket[3] = dataLengthBytes[1];
 
  199      byte[] streamIDBytes = BitConverter.GetBytes((ushort)streamID);
 
  200      dataPacket[4] = streamIDBytes[0];
 
  201      dataPacket[5] = streamIDBytes[1];
 
  207      if (header.Length > 0)
 
  209        string headerStr = JsonUtility.ToJson(header);
 
  210        byte[] headerByte = Encoding.ASCII.GetBytes(headerStr);
 
  211        Buffer.BlockCopy(headerByte, 0, dataPacket, 8, headerByte.Length);
 
  214      Buffer.BlockCopy(data, 0, dataPacket, 8 + header.Length, data.Length);