private static void Handshake(NetworkGameClient client) { GameMessage hello = client.WaitReceive(); if (hello.ContentType != typeof(HandshakeEvent)) { throw new Exception("client expected handshake"); } HandshakeEvent handshake = hello.DeserializeContent <HandshakeEvent>(); string handshakeMessage = handshake.HandshakeMessage; // send it back to server to ack client.Send(new GameMessage(new HandshakeEvent(handshakeMessage))); Debug.Log("Handshake complete."); }
private static void Handshake(NetworkGameServer server) { string guid = Guid.NewGuid().ToString(); var handshake = new HandshakeEvent(guid); server.Send(new GameMessage(handshake)); GameMessage received = server.Receive(); if (received.ContentType != typeof(HandshakeEvent)) { throw new Exception("server expected handshake."); } HandshakeEvent internalEvent = received.DeserializeContent <HandshakeEvent>(); if (internalEvent.HandshakeMessage != guid) { throw new Exception($"The client did not respond with the expected handshake message. Expected: {guid}\nSaw: {internalEvent.HandshakeMessage}"); } Debug.Log("Handshake succeeded."); }
private void ParseHandshake(NetworkDataEventArgs e) { foreach (byte b in e.Data) { _parser.NetworkReceivedString += Encoding.UTF8.GetString(new[] { b }); if (_parser.NetworkReceivedString.Contains("\r\n")) { _parser.HttpRequest.Add(_parser.NetworkReceivedString); _parser.NetworkReceivedString = string.Empty; } if (_parser.HttpRequest.Count > 0 && _parser.HttpRequest[_parser.HttpRequest.Count - 1] == "\r\n") { _parser.NetworkReceivedString = string.Empty; try { bool containsSwitch = false; foreach (string s in _parser.HttpRequest) { if (s == "HTTP/1.1 101 Switching Protocols\r\n") { containsSwitch = true; break; } } bool containsUpgrade = false; foreach (string s in _parser.HttpRequest) { if (s == "Upgrade: websocket\r\n") { containsUpgrade = true; break; } } if (containsSwitch && containsUpgrade) { string key = string.Empty; foreach (string s in _parser.HttpRequest) { if (s.Contains("Sec-WebSocket-Accept")) { var strings = s.Split(new[] { ": ", "\r\n" }, StringSplitOptions.RemoveEmptyEntries); key = strings[1]; } } if (key != string.Empty) { var acceptKey = AcceptKeyGenerator.AcceptKey(_parser.SentKey); if (key == acceptKey) { _parser.FirstConnected = false; _parser.IsFirstDataByte = true; HandshakeEvent?.Invoke(this, new ConnectionEventArgs(e.LocalEndPoint, e.RemoteEndPoint)); return; } } OnErrorEvent(new HandshakeException("Wrong Accept")); Stop(); return; } OnErrorEvent(new HandshakeException("Respond format error")); Stop(); } catch (Exception ex) { OnErrorEvent(new HandshakeException($"Internal error", ex)); Stop(); } } } }
private static void SendHandshake(HandshakeEvent args) { args.SendPacket?.Invoke(new HandshakePacket { ServerAddress = args.IP, ServerPort = args.Port, ProtocolVersion = new VarInt(args.ProtocolVersion), NextState = NextState.Status }); }