public void Connect()
    {
        status.text = "Error connecting to that ip";

        TcpClient clientSocket = new TcpClient();

        clientSocket.Connect(ipAddress.text, 1273);

        ConnectedSocket connectedServer = new ConnectedSocket(clientSocket, null);

        GameSettings.connectedServer = connectedServer;

        //setup threads

        Thread disconnectThread = new Thread(new ThreadStart(() => connectedServer.WaitForDisconnect()));

        disconnectThread.Start();

        connectedServer.playerDisconnectThread = disconnectThread;

        Thread messageThread = new Thread(connectedServer.WaitForMessages);

        messageThread.Start();

        connectedServer.playerMessageThread = messageThread;

        status.text  = "Connected!";
        status.color = new Color(0, 1, 0);
    }
Exemple #2
0
    private void ReceiveMessageCallback(IAsyncResult Result)
    {
        ConnectedSocket.EndReceive(Result);

        WebSocketFrame CurrentFrame = new WebSocketFrame(ReceiveBuffer, ConnectedSocket);

        CurrentFrame.ReceivePayload(ConnectedSocket);

        if (CurrentFrame.PayloadOpCode == WebSocketOpCode.ConnectionCloseFrame)
        {
            ConnectedServer.DisconnectUser(this);
            return;
        }

        if (CurrentPacket == null)
        {
            CurrentPacket = new WebSocketPacket(CurrentFrame);
        }

        CurrentPacket.AddFrame(CurrentFrame);

        if (CurrentFrame.HeaderFrame.FinalPacket)
        {
            ConnectedServer.Receive(this, CurrentPacket.Payload, CurrentPacket.PayloadOpCode);
            CurrentPacket = null;
            GC.Collect();
        }

        Array.Clear(ReceiveBuffer, 0, ReceiveBuffer.Length);

        ConnectedSocket.BeginReceive(ReceiveBuffer, 0, 2, SocketFlags.None, ReceiveMessageCallback, null);
    }
Exemple #3
0
        private void DisconnectClient(ConnectedSocket client)
        {
            client.Socket.AsSafeDisposable().Dispose();
            ConnectedSocket unused;

            _Clients.TryRemove(client, out unused);
        }
Exemple #4
0
 public bool SendFile(string path)
 {
     if (ConnectedSocket != null && ConnectedSocket.Connected)
     {
         try
         {
             FileInfo fi      = new FileInfo(path);
             byte[]   len     = BitConverter.GetBytes(fi.Length);
             byte[]   name    = UTF8.GetBytes(fi.Name);
             byte[]   nameLen = BitConverter.GetBytes(name.Length);
             byte[]   head    = new byte[1 + len.Length + nameLen.Length + name.Length];
             head[0] = (byte)ChatType.File;
             Array.Copy(len, 0, head, 1, len.Length);
             Array.Copy(nameLen, 0, head, 1 + len.Length, nameLen.Length);
             Array.Copy(name, 0, head, 1 + len.Length + nameLen.Length, name.Length);
             ConnectedSocket.SendFile(
                 path,
                 head,
                 null,
                 TransmitFileOptions.UseDefaultWorkerThread
                 );
             return(true);
         }
         catch (Exception e)
         {
             // 连接断开了
             Console.WriteLine("send file exception : " + e.Message);
         }
     }
     return(false);
 }
    public void RemovePlayerFromList(ConnectedSocket client)
    {
        playerAmount--;
        unitAmountChooser.playerAmount = playerAmount;

        int index = GameSettings.connectedPlayers.IndexOf(client);

        GameObject playerText = null;

        if (playerTexts.Count <= index)
        {
            playersToSpawn--;
        }
        else
        {
            playerText = playerTexts[index];

            for (int i = index; i < playerTexts.Count; i++)
            {
                playerTexts[i].GetComponent <RectTransform>().anchoredPosition += new Vector2(0, 30);

                playerTexts[i].GetComponent <Text>().text = "Player " + (i + 1); //plus one instead because the first player isn't in the array (it's the this computer)
            }


            Destroy(playerText);

            playerTexts.RemoveAt(index);
        }

        GameSettings.connectedPlayers.Remove(client);
    }
Exemple #6
0
        private async Task StartAsync <TContext>(Socket socket, IHttpApplication <TContext> application)
        {
            try
            {
                while (true)
                {
                    var client = await socket.AcceptAsync(_Stopped.Token).ConfigureAwait(false);

                    var connectedSocket = new ConnectedSocket(client);
                    _Clients.TryAdd(connectedSocket, connectedSocket);
                    if (Options.MaxConnections < _Clients.Count)
                    {
                        await EvictAsync().ConfigureAwait(false);
                    }
                    var unused = ListenClient(connectedSocket, application);
                    _Stopped.Token.ThrowIfCancellationRequested();
                }
            }
            catch (OperationCanceledException)
            {
                if (!_Stopped.IsCancellationRequested)
                {
                    throw;
                }
            }
            finally
            {
                _AcceptLoopStopped.Set();
            }
        }
Exemple #7
0
        public Common.ServiceStatus SetMoney(List<Efectivo> val)
        {
            Common.ServiceStatus response = new Common.ServiceStatus();
            response.error.HasError = true;
            response.error.Message = "Error recibido del PaymentDevice";
            ComClass clase = new ComClass();
            clase.funciones = ComClass.function.set_money;
            clase.Inventario = val;
            string Test = JsonConvert.SerializeObject(clase);
            using (var socket = new ConnectedSocket("127.0.0.1", 1337)) // Connects to 127.0.0.1 on port 1337
            {
                socket.Send(Test); // Sends some data
                var data = socket.Receive(); // Receives some data back (blocks execution)
                ComClass deserializedProduct = JsonConvert.DeserializeObject<ComClass>(data);
                if(deserializedProduct.result== ComClass.status_cash.ok)
                {
                    response.IsDone = true;
                    response.error.HasError = false;
                    return response;
                }
            }


            return response;




        }
 public ReadFileOp(ConnectedSocket transport
                   , ByteBuffer byteBuffer)
     : base(byteBuffer.Array)
 {
     _transport  = transport;
     _byteBuffer = byteBuffer;
 }
        public void Start(string configPath)
        {
            AddLog("Starting a node...", LogType.Information);

            try
            {
                Config = NetworkNodeConfig.ParseConfig(configPath);
            }
            catch (Exception e)
            {
                AddLog($"Exception: {e.Message}", LogType.Error);
                return;
            }

            networkNodeRoutingTables.LoadTablesFromConfig(Config, Window);
            networkNodeRoutingTables.StartManagementAgent();

            ConnectToCloud();

            while (true)
            {
                while (ConnectedSocket == null || !ConnectedSocket.Connected)
                {
                    AddLog("Retrying connection to cable cloud...", LogType.Information);
                    ConnectToCloud();
                }

                try
                {
                    var package = ConnectedSocket.Receive();

                    AddLog($"Received package: {package} at port {package.Port}", LogType.Received);

                    Task.Run(() => HandlePackage(package));
                }
                catch (InvalidMPLSPackageException)
                {
                    AddLog("Received package was not a valid package.", LogType.Error);
                }
                catch (SocketException e)
                {
                    // ignore timeout exceptions
                    if (e.SocketErrorCode != SocketError.TimedOut)
                    {
                        if (e.SocketErrorCode == SocketError.Shutdown || e.SocketErrorCode == SocketError.ConnectionReset)
                        {
                            AddLog("Connection to Cloud broken!", LogType.Error);
                            continue;
                        }

                        else
                        {
                            AddLog($"{e.Source}: {e.SocketErrorCode}", LogType.Error);
                        }
                    }
                }
            }
        }
Exemple #10
0
 public void SendFrame(string Data, WebSocketOpCode OpCode, bool LastFrame)
 {
     if (ConnectedSocket.Connected)
     {
         WebSocketFrame Frame       = new WebSocketFrame(Data, OpCode);
         byte[]         FrameBuffer = Frame.GetRawBuffer(LastFrame);
         ConnectedSocket.BeginSend(FrameBuffer, 0, FrameBuffer.Length, SocketFlags.None, SendMessageCallback, null);
     }
 }
Exemple #11
0
 public ProcessingRequest(ConnectedSocket connectedSocket)
 {
     this.connectedSocket = connectedSocket;
     if (connectedSocket.IsProcessing)
     {
         throw new InvalidOperationException("Already processing request");
     }
     connectedSocket.IsProcessing = true;
 }
        private void BeginReceive()
        {
            SocketFlags socketFlags;
            int         offset;

            Logger.WriteEntry("BeginReceive() entry");
            offset      = 0;
            socketFlags = SocketFlags.None;
            ConnectedSocket.BeginReceive(ReceiveState.ReceiveBuffer, offset, ReceiveState.SizeTcpByteArray, socketFlags,
                                         new AsyncCallback(ReceiveCallback), ReceiveState);
        }
    /**
     * Functions
     **/

    //if hosting the server
    public static void SendToAllExcept(string message, ConnectedSocket except)
    {
        foreach (ConnectedSocket connectedPlayer in connectedPlayers)
        {
            if (connectedPlayer == except)
            {
                continue;
            }

            connectedPlayer.SendMessage(message);
        }
    }
Exemple #14
0
        public void HandlePaymentCash(int quantity)
        {
            ComClass clase = new ComClass();
            clase.funciones = ComClass.function.cash_handling;
            clase.Value = quantity;
            string Test = JsonConvert.SerializeObject(clase);
            using (var socket = new ConnectedSocket("127.0.0.1", 1337)) // Connects to 127.0.0.1 on port 1337
            {
                socket.Send(Test); // Sends some data
                var data = socket.Receive(); // Receives some data back (blocks execution)
            }

        }
Exemple #15
0
        private void button1_Click(object sender, EventArgs e)
        {
            ComClass clase = new ComClass();

            clase.funciones = ComClass.function.cash_handling;
            clase.Value     = 4500;
            string Test = JsonConvert.SerializeObject(clase);

            using (var socket = new ConnectedSocket("127.0.0.1", 1337)) // Connects to 127.0.0.1 on port 1337
            {
                socket.Send(Test);                                      // Sends some data
                var data = socket.Receive();                            // Receives some data back (blocks execution)
            }
        }
        public static Mod CheckForUpdate() // https://download2.survival-machines.fr/vrcmodloader/VRCModLoaderHashCheck.php?localhash=b9a34bb327390008c235cefe8d8f4ada
        {
            var mod = GetMod(Setup.Mods.VRCModLoaderDLL().FullName);

            using (var socket = new ConnectedSocket("vrchat.survival-machines.fr", 26341))
            {
                var request = new VRCTRequest(Type.GETINSTALLERVERSION, "");
                socket.Send(request.toJSON());
                //var data = socket.Receive();
                //var response = new VRCTResponse(data);
                // Logger.Log("recieved:", data);
            }
            return(mod);
        }
        public void Start()
        {
            while (true)
            {
                AddLog("Management agent starting...", LogType.Information);

                ConnectToMS();

                if (ConnectedSocket == null)
                {
                    // connection failed
                    // start over
                    continue;
                }

                while (true)
                {
                    try
                    {
                        byte[] buffer = new byte[512];
                        int    bytes  = ConnectedSocket.Receive(buffer);

                        var message = Encoding.ASCII.GetString(buffer, 0, bytes);

                        Task.Run(() => HandleMessage(message));
                    }
                    catch (SocketException e)
                    {
                        // ignore timeout exceptions
                        if (e.SocketErrorCode != SocketError.TimedOut)
                        {
                            if (e.SocketErrorCode == SocketError.Shutdown || e.SocketErrorCode == SocketError.ConnectionReset)
                            {
                                AddLog("Connection to MS broken!", LogType.Error);
                                break;
                            }

                            else
                            {
                                AddLog($"{e.Source}: {e.SocketErrorCode}", LogType.Error);
                            }
                        }
                    }
                }
            }
        }
        public void Send(String sendText)
        {
            // Convert the text to byte data using ASCII encoding.
            byte[] byteData = Encoding.ASCII.GetBytes(sendText);

            // Begin sending the data to the remote device.
            SocketFlags socketFlags;
            int         offset;

            offset      = 0;
            socketFlags = SocketFlags.None;
            ConnectedSocket.BeginSend(byteData, offset, byteData.Length, socketFlags,
                                      new AsyncCallback(SendCallback), ConnectedSocket);

            //	Wait for the completion signal.
            SendDoneEvent.WaitOne();
        }
Exemple #19
0
		public string StartClient(string whatToSend)
		{
			// Connect to a remote device.
			try
			{
				// Establish the remote endpoint for the socket.
				IPAddress ipAddress = IPAddress.Parse(_serverIp);

				//IPAddress ipAddress = IPAddress.Parse("2.109.10.231");
				IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

				// Create a TCP/IP  socket.
				var sender = new ConnectedSocket(remoteEP); 

				// Connect the socket to the remote endpoint. Catch any errors.
				try
				{
					// Send the data through the socket.
					sender.Send(whatToSend);

					// Receive the response from the remote device.
					var received = "";
					do {
						received += sender.Receive(1024);
						Thread.Sleep(20);
					}
					while (sender.AnythingToReceive);

					Console.WriteLine(received);
					return received;

				}
				catch (Exception)
				{
					return JsonConvert.SerializeObject(new LoginResponseMsg("", false) { MessageInfo = "Error - Server did not respond\nMake sure server is started and Emil isn't nearby" }, _jsonSettings);
				}

			}
			catch (Exception)
			{
				return JsonConvert.SerializeObject(new LoginResponseMsg("", false) {MessageInfo = "Error - Server did not respond\nMake sure server is started and Emil isn't nearby"}, _jsonSettings);
			}
		}
        private void ConnectToCloud()
        {
            AddLog($"Connecting to cable cloud at {Config.CloudAddress}:{Config.CloudPort}", LogType.Information);

            try
            {
                MPLSSocket socket = new MPLSSocket(Config.ManagementSystemAddress.AddressFamily, SocketType.Stream,
                                                   ProtocolType.Tcp);

                socket.Connect(new IPEndPoint(Config.CloudAddress, Config.CloudPort));

                socket.Send(Encoding.ASCII.GetBytes($"{ManagementActions.HELLO} {Config.NodeName}"));
                AddLog("Estabilished connection with cable cloud", LogType.Information);

                ConnectedSocket = socket;

                Task.Run(async() =>
                {
                    while (true)
                    {
                        var connectionGood = ConnectedSocket != null && ConnectedSocket.Connected;
                        if (connectionGood)
                        {
                            ConnectedSocket.Send(Encoding.ASCII.GetBytes("KEEPALIVE"));

                            await Task.Delay(5000);
                        }
                        else
                        {
                            AddLog("Connection to cable cloud broken!", LogType.Error);

                            break;
                        }
                    }
                });
            }
            catch (Exception)
            {
                AddLog("Failed to connect to cable cloud", LogType.Error);
            }
        }
        private void HandlePackage(MPLSPackage package)
        {
            MPLSPackage routedPackage = null;

            routedPackage = packageSwitch.RouteMPLSPackage(package, networkNodeRoutingTables, Window);
            if (routedPackage == null)
            {
                return;
            }
            try
            {
                ConnectedSocket.Send(routedPackage);
                AddLog(
                    $"Package {package} routed to port {routedPackage.Port} with label {routedPackage.PeekTopLabel()?.Number.ToString() ?? "None"}",
                    LogType.Sent);
            }
            catch (Exception e)
            {
                AddLog($"Package {routedPackage} not sent correctly: {e.Message}", LogType.Error);
            }
        }
Exemple #22
0
        public List<Efectivo> GetInventario()
        {
            
                ComClass clase = new ComClass();
                clase.funciones = ComClass.function.get_money;

                string Test = JsonConvert.SerializeObject(clase);
                using (var socket = new ConnectedSocket("127.0.0.1", 1337)) // Connects to 127.0.0.1 on port 1337
                {
                    socket.Send(Test); // Sends some data
                    var data = socket.Receive(); // Receives some data back (blocks execution)
                    ComClass deserializedProduct = JsonConvert.DeserializeObject<ComClass>(data);
                    return deserializedProduct.Inventario;
                }


               

          

        }
        private void ReceiveCallback(IAsyncResult asyncResult)
        {
            try
            {
                // Retrieve the state object and the clientSocket socket from the asynchronous state object.
                CallbackReceiveState callbackReceiveState = ( CallbackReceiveState )asyncResult.AsyncState;

                // Read data from the remote device.
                int bytesRead = ConnectedSocket.EndReceive(asyncResult);

                if (bytesRead > 0)
                {
                    Logger.WriteEntry("ReceiveCallBack() Received " + bytesRead.ToString());

                    // Accumulate the received text.
                    string receivedText = Encoding.ASCII.GetString(callbackReceiveState.ReceiveBuffer, 0, bytesRead);
                    callbackReceiveState.Sb.Append(receivedText);

                    // Recursively get the rest of the data.
                    BeginReceive();
                }
                else
                {
                    Logger.WriteEntry("ReceiveCallBack() Received 0 bytes.  Should be done. ");

                    //	All the text has arrived.
                    if (callbackReceiveState.Sb.Length > 1)
                    {
                        this.ReceivedText = callbackReceiveState.Sb.ToString();
                    }
                    Logger.WriteEntry("ReceiveDoneEvent.Set() to signal completion.");
                    //	Signal the completion of the message.
                    ReceiveDoneEvent.Set();
                }
            }
            catch (Exception e)
            {
                Logger.WriteEntry(e.ToString());
            }
        }
Exemple #24
0
        public List<Common.ServiceStatus> GetDevicesStatus()
        {

            try
            {
                ComClass clase = new ComClass();
                clase.funciones = ComClass.function.get_devices_status;

                string Test = JsonConvert.SerializeObject(clase);
                using (var socket = new ConnectedSocket("127.0.0.1", 1337)) // Connects to 127.0.0.1 on port 1337
                {
                    socket.Send(Test); // Sends some data
                    var data = socket.Receive(); // Receives some data back (blocks execution)
                    ComClass deserializedProduct = JsonConvert.DeserializeObject<ComClass>(data);
                    Helpers.Utilities.WriteLocalLog("[GetDevicesStatus] Devices loaded ok");
                    return deserializedProduct.DeviceStatus;
                }
            }catch(Exception e)
            {
                Helpers.Utilities.WriteLocalLog("[GetDevicesStatus] " + e.Message);
            }
            return null;   
        }
Exemple #25
0
        public bool Send(string msg)
        {
            if (ConnectedSocket != null && ConnectedSocket.Connected)
            {
                byte[] buffer  = UTF8.GetBytes(msg);
                byte[] len     = BitConverter.GetBytes((long)buffer.Length);
                byte[] content = new byte[1 + len.Length + buffer.Length];
                content[0] = (byte)ChatType.Str;
                Array.Copy(len, 0, content, 1, len.Length);
                Array.Copy(buffer, 0, content, 1 + len.Length, buffer.Length);

                try
                {
                    ConnectedSocket.Send(content);
                    return(true);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message + "   ooo");
                }
            }
            return(false);
        }
    public void WaitForConnection()
    {
        TcpListener serverSocket = GameSettings.serverSocket;

        TcpClient clientSocket = serverSocket.AcceptTcpClient();

        print("connected");

        //NetworkStream networkStream = clientSocket.GetStream();
        //byte[] bytesFrom = new byte[50];
        //networkStream.Read(bytesFrom, 0, bytesFrom.Length);

        //print(System.Text.Encoding.ASCII.GetString(bytesFrom));

        ConnectedSocket connectedPlayer = new ConnectedSocket(clientSocket, null);

        GameSettings.connectedPlayers.Add(connectedPlayer);

        //this will make the main thread spawn a new player text
        playersToSpawn++;

        t = new Thread(new ThreadStart(WaitForConnection));
        t.Start();

        Thread disconnectThread = new Thread(new ThreadStart(() => connectedPlayer.WaitForDisconnect(playersToRemove)));

        disconnectThread.Start();

        connectedPlayer.playerDisconnectThread = disconnectThread;

        Thread messageThread = new Thread(connectedPlayer.WaitForMessages);

        messageThread.Start();

        connectedPlayer.playerMessageThread = messageThread;
    }
Exemple #27
0
        public void Complete(int bytes_transferred, bool success, int error, object context)
        {
            if (!success)
            {
                try
                {
                    _core.ReleaseSocket(_socket, false);
                    _socket = null;
                }
                catch { }
                _connector.OnError(_throwError, _context, new ConnectError(_connector.ConnectTo, new SocketException(error)));
                return;
            }

            Exception exception = null;

            try
            {
                if (null != _byteBuffer && 0 < bytes_transferred)
                {
                    _byteBuffer.Begin += bytes_transferred;
                }


                _logger.InfoFormat("连接到[{0}]成功,开始初始化!", _connector.ConnectTo);
                _socket.SetRemote(_connector.ConnectTo, null);
                _socket.SetSockOpt(SocketOptionLevel.Socket
                                   , SocketOptionName.UpdateConnectContext
                                   , _socket.Handle);


                ConnectedSocket connectedSocket = new ConnectedSocket(_core, _socket, new ProtocolContext(null, _connector.Config));
                _socket = null;

                try
                {
                    IProtocol protocol = _buildProtocol(connectedSocket, _context);
                    _core.InitializeConnection(connectedSocket, protocol);

                    //FIXME: 将在连接时没有发送完的数据,再发送(不能放在)
                    ///if (null != _byteBuffer && 0 < _byteBuffer.Count)
                    ///    connectedSocket.Write(_byteBuffer);

                    _logger.InfoFormat("连接到[{0}]成功,初始化成功!", _connector.ConnectTo);
                    return;
                }
                catch (Exception)
                {
                    _socket = connectedSocket.ReleaseSocket();
                }
            }
            catch (Exception e)
            {
                exception = new InitializeError(_connector.ConnectTo,
                                                string.Format("初始化连接到[{0}]通道,发生错误!", _connector.ConnectTo), e);
            }
            try
            {
                _core.ReleaseSocket(_socket, false);
                _socket = null;
            }
            catch { }

            _connector.OnError(_throwError, _context, exception);
        }
        private void ConnectToMS()
        {
            AddLog($"Connecting to MS at {Config.ManagementSystemAddress}:{Config.ManagementSystemPort}", LogType.Information);
            while (true)
            {
                Socket socket = new Socket(Config.ManagementSystemAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                socket.ReceiveTimeout = 20000;

                try
                {
                    var result = socket.BeginConnect(new IPEndPoint(Config.ManagementSystemAddress, Config.ManagementSystemPort), null, null);

                    bool success = result.AsyncWaitHandle.WaitOne(5000, true);
                    if (success)
                    {
                        socket.EndConnect(result);
                    }
                    else
                    {
                        socket.Close();
                        AddLog("Connection to MS not established - timeout...", LogType.Error);
                        continue;
                    }
                }
                catch (Exception)
                {
                    AddLog("Retrying...", LogType.Information);
                }

                try
                {
                    AddLog($"Sending hello to MS...", LogType.Information);
                    socket.Send(Encoding.ASCII.GetBytes($"{ManagementActions.HELLO} {Config.NodeName}"));

                    byte[] buffer = new byte[256];
                    int    bytes  = socket.Receive(buffer);

                    var message = Encoding.ASCII.GetString(buffer, 0, bytes);

                    if (message.Contains(ManagementActions.HELLO))
                    {
                        AddLog("Estabilished connection with MS", LogType.Information);
                        ConnectedSocket = socket;

                        break;
                    }
                }
                catch (Exception)
                {
                    AddLog("Couldn't connect to MS!", LogType.Error);
                }
            }

            Task.Run(async() =>
            {
                while (true)
                {
                    var connectionGood = ConnectedSocket != null && ConnectedSocket.Connected;
                    if (connectionGood)
                    {
                        ConnectedSocket.Send(Encoding.ASCII.GetBytes("KEEPALIVE"));

                        await Task.Delay(5000);
                    }
                    else
                    {
                        AddLog("Connection to MS broken!", LogType.Error);

                        break;
                    }
                }
            });
        }
Exemple #29
0
        private async Task ListenClient <TContext>(ConnectedSocket connectedSocket, IHttpApplication <TContext> application)
        {
            try
            {
                var client        = connectedSocket.Socket;
                var networkStream = new NetworkStream(client, false);
                while (true)
                {
                    using (var disposables = new     CompositeDisposable())
                    {
                        var stream = new TCPStream(networkStream)
                        {
                            ArrayPool      = Options.ArrayPool,
                            Cancellation   = _Stopped.Token,
                            MaxArrayLength = Options.MaxBytesArrayLength,
                            MaxMessageSize = Options.MaxMessageSize
                        };
                        disposables.Children.Add(stream);
                        var idleTimeout = new CancellationTokenSource();
                        idleTimeout.CancelAfter(Options.IdleTimeout);
                        disposables.Children.Add(idleTimeout);
                        var linked = CancellationTokenSource.CreateLinkedTokenSource(stream.Cancellation, idleTimeout.Token);
                        disposables.Children.Add(linked);
                        stream.Cancellation = linked.Token;
                        var request = await TCPRequest.Parse(stream, Options.IncludeHeaders).ConfigureAwait(false);

                        disposables.Children.Add(connectedSocket.MarkProcessingRequest());

                        var context = (HostingApplication.Context)(object) application.CreateContext(Features);

                        context.HttpContext = new TCPContext(request, Features, new TCPConnectionInfo(client, _ListeningEndPoint));
                        await application.ProcessRequestAsync((TContext)(object)context);

                        CancellationTokenSource sendTimeout = new CancellationTokenSource();
                        sendTimeout.CancelAfter(Options.SendTimeout);
                        disposables.Children.Add(sendTimeout);
                        linked = CancellationTokenSource.CreateLinkedTokenSource(stream.Cancellation, sendTimeout.Token);
                        disposables.Children.Add(linked);
                        stream.Cancellation = linked.Token;
                        var response = (TCPResponse)context.HttpContext.Response;
                        try
                        {
                            response.OnStarting();
                            await stream.WriteVarIntAsync((ulong)response.StatusCode).ConfigureAwait(false);

                            if (Options.IncludeHeaders)
                            {
                                await stream.WriteVarIntAsync((ulong)response.Headers.Count).ConfigureAwait(false);

                                foreach (var header in response.Headers)
                                {
                                    await stream.WriteStringAsync(header.Key).ConfigureAwait(false);

                                    await stream.WriteStringAsync(header.Value).ConfigureAwait(false);
                                }
                            }

                            await stream.WriteVarIntAsync((ulong)response.Body.Length);

                            response.Body.Position = 0;
                            await response.Body.CopyToAsync(networkStream, 81920, stream.Cancellation).ConfigureAwait(false);

                            await networkStream.FlushAsync(stream.Cancellation).ConfigureAwait(false);
                        }
                        finally
                        {
                            response.OnCompleted();
                            connectedSocket.LastReceivedMessage = DateTimeOffset.UtcNow;
                        }
                    }
                }
            }
            catch (OperationCanceledException)
            {
                if (!_Stopped.IsCancellationRequested)
                {
                    throw;
                }
            }
            finally
            {
                DisconnectClient(connectedSocket);
            }
        }
 public DisconnectRequest(ConnectedSocket connectedSocket, Exception error)
     : base(null)
 {
     _connectedSocket = connectedSocket;
     _exception       = error;
 }
Exemple #31
0
        void InitializeConnection(int bytes_transferred, object context)
        {
            IntPtr bytePointer = Marshal.UnsafeAddrOfPinnedArrayElement(
                _byteBuffer.Array, _byteBuffer.End);
            HazelAddress localAddr  = null;
            HazelAddress remoteAddr = null;

            HazelSocket.GetAcceptExSockaddrs(bytePointer
                                             , 0
                                             , HazelAddress.MaxSize + 4
                                             , HazelAddress.MaxSize + 4
                                             , out localAddr
                                             , out remoteAddr);

            _byteBuffer.End   += bytes_transferred;
            _byteBuffer.Begin += (2 * (HazelAddress.MaxSize + 4));

            _socket.SetLocalAddress(localAddr);
            _socket.SetRemoteAddress(remoteAddr);

            _socket.SetSockOpt(SocketOptionLevel.Socket, SocketOptionName.UpdateAcceptContext, _socket.Handle);


            _acceptor.Logger.InfoFormat("获取到来自[{0}]的连接,开始初始化!", _socket.RemoteEndPoint);

            IOCPCore core = _acceptor.Core.GetNextCore();

            if (!core.Bind(_socket))
            {
                Win32Exception err = new Win32Exception();
                _acceptor.OnError(new InitializeError(_acceptor.BindPoint, string.Format("初始化来自[{0}]的连接时,绑定到iocp发生错误 - {0}", _socket.RemoteEndPoint, err.Message), err));
                return;
            }

            InitializeError initializeError = null;
            ConnectedSocket connectedSocket = null;

            try
            {
                IDictionary <string, object> misc = (null == _acceptor.ProtocolFactory) ? null : _acceptor.ProtocolFactory.Misc;
                connectedSocket = new ConnectedSocket(core, _socket, new ProtocolContext(null, misc));
                IProtocol protocol = _acceptor.CreateProtocol(connectedSocket);
                core.InitializeConnection(connectedSocket, protocol);
                _acceptor.Logger.InfoFormat("初始化来自[{0}]的连接成功!", _socket.RemoteEndPoint);
                _socket = null;
            }
            catch (InitializeError e)
            {
                initializeError = e;
            }
            catch (Exception e)
            {
                initializeError = new InitializeError(_socket.RemoteEndPoint, "在处理新连接时发生异常!", e);
            }

            if (null != initializeError)
            {
                if (null != connectedSocket)
                {
                    connectedSocket.ReleaseSocket();
                }

                _acceptor.OnError(initializeError);
            }
        }