diff --git a/Lidgren.Network/Lidgren.Network.csproj b/Lidgren.Network/Lidgren.Network.csproj index 86029e9..30d0e8b 100644 --- a/Lidgren.Network/Lidgren.Network.csproj +++ b/Lidgren.Network/Lidgren.Network.csproj @@ -55,6 +55,7 @@ + diff --git a/Lidgren.Network/NetPeer.Internal.cs b/Lidgren.Network/NetPeer.Internal.cs index aaa92b5..7c620b4 100644 --- a/Lidgren.Network/NetPeer.Internal.cs +++ b/Lidgren.Network/NetPeer.Internal.cs @@ -34,12 +34,20 @@ namespace Lidgren.Network internal long m_uniqueIdentifier; private AutoResetEvent m_messageReceivedEvent = new AutoResetEvent(false); + private List> m_receiveCallbacks; /// /// Gets the socket, if Start() has been called /// public Socket Socket { get { return m_socket; } } + public void RegisterReceivedCallback(SendOrPostCallback callback) + { + if (m_receiveCallbacks == null) + m_receiveCallbacks = new List>(); + m_receiveCallbacks.Add(new NetTuple(SynchronizationContext.Current, callback)); + } + internal void ReleaseMessage(NetIncomingMessage msg) { NetException.Assert(msg.m_incomingMessageType != NetIncomingMessageType.Error); @@ -51,8 +59,15 @@ namespace Lidgren.Network } m_releasedIncomingMessages.Enqueue(msg); + if (m_messageReceivedEvent != null) m_messageReceivedEvent.Set(); + + if (m_receiveCallbacks != null) + { + foreach (var tuple in m_receiveCallbacks) + tuple.Item1.Post(tuple.Item2, this); + } } private void InitializeNetwork() diff --git a/Lidgren.Network/NetSRP.cs b/Lidgren.Network/NetSRP.cs index fa60cd2..b30ac09 100644 --- a/Lidgren.Network/NetSRP.cs +++ b/Lidgren.Network/NetSRP.cs @@ -63,7 +63,7 @@ namespace Lidgren.Network } /// - /// Computer private key + /// Computer private key (x) /// public static byte[] ComputePrivateKey(string username, string password, byte[] salt) { @@ -85,8 +85,6 @@ namespace Lidgren.Network /// public static byte[] ComputeServerVerifier(byte[] privateKey) { - var sha = GetHashAlgorithm(); - NetBigInteger x = new NetBigInteger(NetUtility.ToHexString(privateKey), 16); // Verifier (v) = g^x (mod N) @@ -95,6 +93,15 @@ namespace Lidgren.Network return serverVerifier.ToByteArrayUnsigned(); } + /// + /// SHA hash data + /// + public static byte[] Hash(byte[] data) + { + var sha = GetHashAlgorithm(); + return sha.ComputeHash(data); + } + /// /// Compute client public ephemeral value (A) /// @@ -124,7 +131,7 @@ namespace Lidgren.Network } /// - /// Compute intermediate value U + /// Compute intermediate value (u) /// public static byte[] ComputeU(byte[] clientPublicEphemeral, byte[] serverPublicEphemeral) { diff --git a/Lidgren.Network/NetUPnP.cs b/Lidgren.Network/NetUPnP.cs index 94467eb..b62e022 100644 --- a/Lidgren.Network/NetUPnP.cs +++ b/Lidgren.Network/NetUPnP.cs @@ -14,6 +14,9 @@ namespace Lidgren.Network private string m_serviceUrl; private NetPeer m_peer; + /// + /// NetUPnP constructor + /// public NetUPnP(NetPeer peer) { m_peer = peer; diff --git a/Samples/Chat/ChatClient/Program.cs b/Samples/Chat/ChatClient/Program.cs index f255473..ca0bdb4 100644 --- a/Samples/Chat/ChatClient/Program.cs +++ b/Samples/Chat/ChatClient/Program.cs @@ -24,7 +24,7 @@ namespace ChatClient NetPeerConfiguration config = new NetPeerConfiguration("chat"); s_client = new NetClient(config); - Application.Idle += new EventHandler(Application_Idle); + s_client.RegisterReceivedCallback(new SendOrPostCallback(GotMessage)); Application.Run(s_form); @@ -36,44 +36,40 @@ namespace ChatClient NativeMethods.AppendText(s_form.richTextBox1, text); } - private static void Application_Idle(object sender, EventArgs e) + public static void GotMessage(object peer) { - while (NativeMethods.AppStillIdle) + NetIncomingMessage im; + while ((im = s_client.ReadMessage()) != null) { - NetIncomingMessage im; - while ((im = s_client.ReadMessage()) != null) + // handle incoming message + switch (im.MessageType) { - // handle incoming message - switch (im.MessageType) - { - case NetIncomingMessageType.DebugMessage: - case NetIncomingMessageType.ErrorMessage: - case NetIncomingMessageType.WarningMessage: - case NetIncomingMessageType.VerboseDebugMessage: - string text = im.ReadString(); - Output(text); - break; - case NetIncomingMessageType.StatusChanged: - NetConnectionStatus status = (NetConnectionStatus)im.ReadByte(); + case NetIncomingMessageType.DebugMessage: + case NetIncomingMessageType.ErrorMessage: + case NetIncomingMessageType.WarningMessage: + case NetIncomingMessageType.VerboseDebugMessage: + string text = im.ReadString(); + Output(text); + break; + case NetIncomingMessageType.StatusChanged: + NetConnectionStatus status = (NetConnectionStatus)im.ReadByte(); - if (status == NetConnectionStatus.Connected) - s_form.EnableInput(); - else - s_form.DisableInput(); - string reason = im.ReadString(); - Output(status.ToString() + ": " + reason); - - break; - case NetIncomingMessageType.Data: - string chat = im.ReadString(); - Output(chat); - break; - default: - Output("Unhandled type: " + im.MessageType + " " + im.LengthBytes + " bytes"); - break; - } + if (status == NetConnectionStatus.Connected) + s_form.EnableInput(); + else + s_form.DisableInput(); + string reason = im.ReadString(); + Output(status.ToString() + ": " + reason); + + break; + case NetIncomingMessageType.Data: + string chat = im.ReadString(); + Output(chat); + break; + default: + Output("Unhandled type: " + im.MessageType + " " + im.LengthBytes + " bytes"); + break; } - Thread.Sleep(1); } } @@ -93,6 +89,7 @@ namespace ChatClient // s_client.Shutdown("Requested by user"); } + // called by the UI public static void Send(string text) { NetOutgoingMessage om = s_client.CreateMessage(text);