/// <summary> /// Create a connection to a remote endpoint. /// </summary> public virtual NetConnection Connect(IPEndPoint remoteEndPoint, NetOutgoingMessage?hailMessage) { if (remoteEndPoint == null) { throw new ArgumentNullException(nameof(remoteEndPoint)); } if (Configuration.DualStack) { remoteEndPoint = NetUtility.MapToIPv6(remoteEndPoint); } if (Status == NetPeerStatus.NotRunning) { throw new LidgrenException("Must call Start() first."); } if (ConnectionLookup.ContainsKey(remoteEndPoint)) { throw new LidgrenException("Already connected to that endpoint!"); } if (Handshakes.TryGetValue(remoteEndPoint, out NetConnection? hs)) { // already trying to connect to that endpoint; make another try switch (hs.Status) { case NetConnectionStatus.InitiatedConnect: // send another connect hs._connectRequested = true; break; case NetConnectionStatus.RespondedConnect: // send another response hs.SendConnectResponse(NetTime.Now, false); break; default: // weird LogWarning(NetLogMessage.FromValues(NetLogCode.UnexpectedHandshakeStatus, value: (int)hs.Status)); break; } return(hs); } var conn = new NetConnection(this, remoteEndPoint); conn.Status = NetConnectionStatus.InitiatedConnect; conn.LocalHailMessage = hailMessage; // handle on network thread conn._connectRequested = true; conn._connectionInitiator = true; Handshakes.TryAdd(remoteEndPoint, conn); return(conn); }
private static void HandleHandshakeMessage2(SksMessageReceivedEventArgs sksMessageReceivedEventArgs) { var user = GetUserByIpAndPort(sksMessageReceivedEventArgs.FromIp, sksMessageReceivedEventArgs.FromPort); Handshake handshake; lock (handshakesLock) { handshake = Handshakes.FirstOrDefault(h => h.User == user); } if (handshake == null) { Logger.Log(LogTag, "ERROR: Handshake message 2 - handshake doesn't exist"); return; } var message = HandshakeMessage2.FromString(sksMessageReceivedEventArgs.Message); user.Protocol = message.ProtocolId; switch (message.ProtocolId) { case ProtocolType.None: break; case ProtocolType.Akep2: InitAkep2(user, SksClientType.Local); break; case ProtocolType.LamportScheme: InitLamportScheme(user, SksClientType.Local); break; case ProtocolType.OtwayRees: break; case ProtocolType.Rsa: break; default: throw new ArgumentOutOfRangeException(); } }
private static void HandleHandshakeMessage1(SksMessageReceivedEventArgs sksMessageReceivedEventArgs) { var user = GetUserByIpAndPort(sksMessageReceivedEventArgs.FromIp, sksMessageReceivedEventArgs.FromPort); Handshake handshake; lock (handshakesLock) { handshake = Handshakes.FirstOrDefault(h => h.User == user); } if (handshake != null) { Logger.Log(LogTag, "ERROR: Handshake message 1 - handshake already existed"); return; } handshake = InitHandshake(user, SksClientType.Remote); if (handshake == null) { return; } var message = HandshakeMessage1.FromString(sksMessageReceivedEventArgs.Message); user.Protocol = Utils.DetermineProtocol(user); if (user.Protocol == ProtocolType.LamportScheme) { InitLamportScheme(user, SksClientType.Remote); } var newMessage = new HandshakeMessage2(user.Protocol, null); user.SendMessage(newMessage.ToString()); handshake.IncrementMessageCount(); }
public static Handshake InitHandshake(User user, SksClientType clientType) { Logger.Log(LogTag, $"InitHandshake - User: {user.Name}. ClientType: {clientType}"); lock (handshakesLock) { if (Handshakes.Any(h => h.User == user)) { Logger.Log(LogTag, "ERROR: Handshake already exists"); return(null); } } var newHandshake = new Handshake(user); newHandshake.Start(clientType); lock (handshakesLock) { Handshakes.Add(newHandshake); } return(newHandshake); }