Exemplo n.º 1
0
        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.");
        }
Exemplo n.º 2
0
        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();
                    }
                }
            }
        }
Exemplo n.º 4
0
 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
     });
 }