public override void WriteRequest(NetworkPacket packet) { packet.Write(startPos); //first stream segment if (startPos == 0) { packet.Write((uint)byteData.Length); packet.Write(command); } //all stream segments int headerSize = packet.byteLength + 4; segmentLen = (uint)byteData.Length - startPos; uint remaining = segmentLen; int maxLen = NetworkConfig.BufferMaxLength - headerSize; if (remaining > maxLen) { segmentLen = (uint)maxLen; } packet.Write(segmentLen); packet.Write(byteData, startPos, segmentLen); startPos += segmentLen; }
// 0000 0000 // bits 1-4 => Channel Type (up to 16 channels) // bits 5 => Send Type // bits 6 => Reliable Flag // bits 7 => Endian Flag // bits 8 => ProtocolType Flag public override void WriteHeader(NetworkPacket packet, NetworkMessage message) { if (message.header.isSTUN) { return; } uint msgBits = (uint)message.header.channelType; if (msgBits < 0 || msgBits >= (uint)ChannelType.LAST) { msgBits = 0; } //add sendType to bit 5 if (message.header.sendType == SendType.Response) { msgBits |= SendTypeFlag; } //add reliable to bit 6 if (message.header.isReliable) { msgBits |= ReliableFlag; } //add little endian to bit 8 if (message.header.isStream) { msgBits |= StreamFlag; } msgBits |= ProtocolTypeFlag; packet.Write((byte)msgBits); packet.Write(message.header.sequence); OnWriteHeader.Invoke(packet, message); if (message.header.isReliable) { if (message.header.sendType == SendType.Message && message.header.retryCount == 0) { message.header.ackkey = GenerateAckKey(packet, message); } } }
public void Write(NetworkPacket packet) { if (username.Length > MAX_NAME_LENGTH) { username = username.Substring(0, MAX_NAME_LENGTH); } packet.Write(username); }
public override void WriteRequest(NetworkPacket packet) { //method id packet.Write((ushort)method); //method length packet.Write((ushort)0); //transaction id header.ackkey = BitConverter.ToUInt32(transactionID, 0); packet.Write(transactionID); //attributes for (int i = 0; i < attributeBytes.Count; i++) { LogAttribute(i); packet.Write(attributeBytes[i]); } //update message length int totalLength = packet.byteLength - 20; int lastPos = packet.byteLength; if (integrity) { totalLength += 24; } packet.byteLength = 2; packet.Write((ushort)totalLength); packet.byteLength = lastPos; //method integrity goes here if (integrity) { //GenerateMessageIntegrity(packet); AddMessageIntegrity(packet); } Console.WriteLine("Message Length = " + totalLength); Console.WriteLine("Total Bytes: " + packet.byteLength); //cleanup attributeBytes.Clear(); }
public void AddMessageIntegrity(NetworkPacket packet) { string saslPassword = new SASLprep().Prepare(password); MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); string valueToHashMD5 = string.Format("{0}:{1}:{2}", username, realm, saslPassword); byte[] hmacSha1Key = md5.ComputeHash(Encoding.UTF8.GetBytes(valueToHashMD5)); HMACSHA1 hmacSha1 = new HMACSHA1(hmacSha1Key); byte[] hmacBytes = hmacSha1.ComputeHash(packet.ByteBuffer, 0, packet.byteLength); packet.Write((ushort)STUNAttribute.MessageIntegrity); packet.Write((ushort)hmacBytes.Length); packet.Write(hmacBytes); Console.WriteLine("Write Attribute: MessageIntegrity(2) MD5 = " + NetworkSerializer.ByteArrayToHexString(hmacSha1Key)); Console.WriteLine("Write Attribute: MessageIntegrity(2) HMAC = " + NetworkSerializer.ByteArrayToHexString(hmacBytes)); }
public override void WriteRequest(NetworkPacket packet) { packet.Write((byte)method); switch (method) { case ServerMethod.CONNECT: request.connect.Write(packet); break; case ServerMethod.HEARTBEAT: break; } }
public override void WriteResponse(NetworkPacket packet) { packet.Write(responseTimestamp); }
public override void WriteRequest(NetworkPacket packet) { packet.Write(timestamp); }
public override void WriteResponse(NetworkPacket packet) { packet.Write(startPos); packet.Write(segmentLen); }
public void OnWriteHeader(object sender, NetworkMessage message) { NetworkPacket packet = (NetworkPacket)sender; packet.Write(message.header.id); }
public void Write(NetworkPacket packet) { packet.Write((byte)1); packet.Write(sendRate); packet.Write(peerId); }