/// <summary> /// Send NetIntroduction to hostExternal and clientExternal; introducing client to host /// </summary> public void Introduce( IPEndPoint hostInternal, IPEndPoint hostExternal, IPEndPoint clientInternal, IPEndPoint clientExternal, string token) { // send message to client NetOutgoingMessage msg = CreateMessage(10 + token.Length + 1); msg.m_messageType = NetMessageType.NatIntroduction; msg.Write(false); msg.WritePadBits(); msg.Write(hostInternal); msg.Write(hostExternal); msg.Write(token); m_unsentUnconnectedMessages.Enqueue(new NetTuple <IPEndPoint, NetOutgoingMessage>(clientExternal, msg)); // send message to host msg = CreateMessage(10 + token.Length + 1); msg.m_messageType = NetMessageType.NatIntroduction; msg.Write(true); msg.WritePadBits(); msg.Write(clientInternal); msg.Write(clientExternal); msg.Write(token); m_unsentUnconnectedMessages.Enqueue(new NetTuple <IPEndPoint, NetOutgoingMessage>(hostExternal, msg)); }
/// <summary> /// Generates a message /// </summary> /// <param name="result">result to generate to</param> /// <param name="data">data to generate from</param> /// <returns>Message containing data</returns> public static NetOutgoingMessage GenerateMessage(NetOutgoingMessage result, Packet data) { if (data.IsReadOnly) throw new HandShakeException("Can not generate a message from a readonly packet"); // TODO: check for expiration time result.WritePadBits(); data.Puts(result); result.WritePadBits(); data.Mark(); return result; }
public static NetOutgoingMessage Compress(NetOutgoingMessage msg) { msg.WritePadBits(); byte[] input = msg.PeekDataBuffer(); byte[] output = new byte[input.Length*2]; int outlength = ZipCompressor.Instance.Compress(input, msg.LengthBytes, output); msg.EnsureBufferSize(outlength*8); input = msg.PeekDataBuffer(); Array.Copy(output, input, outlength); msg.LengthBytes = outlength; msg.LengthBits = outlength * 8; return msg; }