private void ReceiveMessages() { for (byte[] receivedData = _connection.ReceiveData(); receivedData != null && receivedData.Length > 0; receivedData = _connection.ReceiveData()) { { for (int i = 0; i < receivedData.Length;) { // The IP Address is attached at Connection level. I unpack it here. Maybe do it in connection? byte[] ipAddress = { receivedData[i], receivedData[i + 1], receivedData[i + 2], receivedData[i + 3] }; i += 4; int destPort = _destinationPort; if (_destinationPort == -1) { destPort = BitConverter.ToInt16(receivedData, i); } i += 2; byte streamID = receivedData[i++]; // Transform 2 bytes into message size int messageSize = BitConverter.ToInt16(receivedData, i); i += 2; // Build the IPDataPacket byte[] message = new byte[messageSize]; IPEndPoint ipEndPoint = new IPEndPoint(new IPAddress(ipAddress), destPort); Array.Copy(receivedData, i, message, 0, messageSize); i += messageSize; IPDataPacket ipDataPacket = new IPDataPacket(ipEndPoint, message); _streams[streamID].SaveReceivedData(ipDataPacket); } } } }
private void SendMessages() { for (byte i = 0; i < _streams.Length; i++) { // Get streams messages Queue <IPDataPacket> messages = _streams[i].GetMessageToSend(); while (messages.Count != 0) { IPDataPacket packet = messages.Dequeue(); byte[] message = new byte[packet.message.Length + PACKET_OVERHEAD]; // Stream ID message[0] = i; // Message length message[1] = (byte)packet.message.Length; message[2] = (byte)(packet.message.Length >> 8); Array.Copy(packet.message, 0, message, PACKET_OVERHEAD, packet.message.Length); _connection.SendData(message, packet.ip); } } }