public bool TryParse(byte[] buffer) { try { int offset = 0; MessageType = (MessageType)NetBinaryUtil.ReadShort(buffer, ref offset); int messageLength = (ushort)NetBinaryUtil.ReadShort(buffer, ref offset); if (MagicCookie != NetBinaryUtil.ReadUInt(buffer, ref offset)) { return(false); } TransactionId = NetBinaryUtil.ReadBytes(buffer, TransactionIdSize, ref offset); Attributes.Clear(); while (offset < messageLength + 20) { var attr = GetAttribute(buffer, ref offset); if (attr != null) { Attributes.Add(attr); } } return(true); } catch { return(false); } }
protected override void ReadBody(byte[] buf, int offset, int size) { offset += 2; ErrorClass = buf[offset++]; ErrorNumber = buf[offset++]; ReasonPhrase = NetBinaryUtil.ReadString(buf, size - 2, ref offset); }
public void Read(byte[] buf, ref int offset) { Type = (AttributeType)NetBinaryUtil.ReadUShort(buf, ref offset); var size = NetBinaryUtil.ReadUShort(buf, ref offset); ReadBody(buf, offset, size); offset += size + GetPadOffset(size); }
protected override void WriteBody(byte[] buf, ref int offset) { buf[offset++] = 0; buf[offset++] = 0; buf[offset++] = ErrorClass; buf[offset++] = ErrorNumber; NetBinaryUtil.Write(ReasonPhrase, buf, ref offset); }
protected override void WriteBody(byte[] buf, ref int offset) { buf[offset++] = 0; buf[offset++] = (byte)(m_EndPoint.AddressFamily == AddressFamily.InterNetwork ? 1 : 2); var port = (ushort)((ushort)m_EndPoint.Port ^ (ushort)(StunMessage.MagicCookie >> 16)); NetBinaryUtil.Write(port, buf, ref offset); for (int i = 0; i < m_AddressBytes.Length; i++) { s_Buffer[i] = (byte)(m_AddressBytes[i] ^ buf[i + 4]); } NetBinaryUtil.Write(s_Buffer, m_AddressBytes.Length, buf, ref offset); }
protected override void ReadBody(byte[] buf, int offset, int size) { offset++; var family = buf[offset++]; var port = (int)(NetBinaryUtil.ReadUShort(buf, ref offset) ^ (ushort)(StunMessage.MagicCookie >> 16)); byte[] address = NetBinaryUtil.ReadBytes(buf, family == 1 ? 4 : 16, ref offset); for (int i = 0; i < address.Length; i++) { address[i] = (byte)(address[i] ^ buf[i + 4]); } EndPoint = new IPEndPoint(new IPAddress(address), port); }
public void Write(ref byte[] buf, ref int offset) { var totalSize = 4 + GetPaddedLength() + offset; if (buf.Length < totalSize) { System.Array.Resize(ref buf, System.Math.Max(buf.Length * 2, totalSize)); } NetBinaryUtil.Write((ushort)Type, buf, ref offset); NetBinaryUtil.Write((ushort)GetLength(), buf, ref offset); WriteBody(buf, ref offset); offset += GetPadOffset(GetLength()); }
protected override void WriteBody(byte[] buf, ref int offset) { int flag = 0; if (ChangeIP) { flag |= 4; } if (ChangePort) { flag |= 2; } s_Buffer[3] = (byte)flag; NetBinaryUtil.Write(s_Buffer, buf, ref offset); }
StunAttribute GetAttribute(byte[] buf, ref int offset) { int tmp = offset; var type = (AttributeType)NetBinaryUtil.ReadUShort(buf, ref tmp); switch (type) { case AttributeType.MappedAddress: case AttributeType.SourceAddress: case AttributeType.ChangedAddress: case AttributeType.ReflectedFrom: case AttributeType.ResponseAddress: { var attr = new AddressAttribute(type); attr.Read(buf, ref offset); return(attr); } case AttributeType.XorMappedAddress: { var attr = new XorAddressAttribute(type); attr.Read(buf, ref offset); return(attr); } case AttributeType.ErrorCode: { var attr = new ErrorCodeAttribute(type); attr.Read(buf, ref offset); return(attr); } case AttributeType.ServerName: case AttributeType.Username: case AttributeType.Password: { var attr = new ErrorCodeAttribute(type); attr.Read(buf, ref offset); return(attr); } } var len = NetBinaryUtil.ReadUShort(buf, ref tmp); offset += len + StunAttribute.GetPadOffset(len); return(null); }
public int Write(ref byte[] buf) { int offset = 0; NetBinaryUtil.Write((ushort)MessageType, buf, ref offset); int attributesLength = 0; foreach (var attribute in Attributes) { attributesLength += StunAttribute.HeaderSize + attribute.GetPaddedLength(); } NetBinaryUtil.Write((ushort)attributesLength, buf, ref offset); NetBinaryUtil.Write(MagicCookie, buf, ref offset); NetBinaryUtil.Write(TransactionId, TransactionIdSize, buf, ref offset); foreach (var attribute in Attributes) { attribute.Write(ref buf, ref offset); } return(offset); }
protected override void WriteBody(byte[] buf, ref int offset) { NetBinaryUtil.Write(Text, buf, ref offset); }
protected override void ReadBody(byte[] buf, int offset, int size) { NetBinaryUtil.ReadString(buf, size, ref offset); }