コード例 #1
0
        private void AcceptCallback(IAsyncResult ar)
        {
            var newSocket = Listener.EndAccept(ar);
            var node      = NodeBuilder.FromEndpoint((IPEndPoint)newSocket.RemoteEndPoint);

            var receiveState    = CreateNetworkState(newSocket, node);
            var responseChannel = new TcpReactorResponseChannel(this, newSocket, EventLoop.Clone(ProxiesShareFiber));

            SocketMap.Add(node, responseChannel);
            NodeConnected(node, responseChannel);
            newSocket.BeginReceive(receiveState.RawBuffer, 0, receiveState.RawBuffer.Length, SocketFlags.None, ReceiveCallback, receiveState);
            Listener.BeginAccept(AcceptCallback, null); //accept more connections
        }
コード例 #2
0
ファイル: TcpProxyReactor.cs プロジェクト: mishganbest/helios
        private void AcceptCallback(IAsyncResult ar)
        {
            try
            {
                var newSocket = Listener.EndAccept(ar);
                var node      = NodeBuilder.FromEndpoint((IPEndPoint)newSocket.RemoteEndPoint);

                HeliosTrace.Instance.TcpInboundAcceptSuccess();

                var receiveState    = CreateNetworkState(newSocket, node);
                var responseChannel = new TcpReactorResponseChannel(this, newSocket, EventLoop.Clone(ProxiesShareFiber));
                SocketMap.TryAdd(node, responseChannel);
                NodeConnected(node, responseChannel);
                newSocket.BeginReceive(receiveState.RawBuffer, 0, receiveState.RawBuffer.Length, SocketFlags.None,
                                       ReceiveCallback, receiveState);
                Listener.BeginAccept(AcceptCallback, null); //accept more connections
            }
            catch (Exception ex)
            {
                HeliosTrace.Instance.TcpInboundAcceptFailure(ex.Message);
            }
        }
コード例 #3
0
        private void ReceiveCallback(IAsyncResult ar)
        {
            var receiveState = (NetworkState)ar.AsyncState;

            try
            {
                var received = receiveState.Socket.EndReceiveFrom(ar, ref RemoteEndPoint);
                if (received == 0)
                {
                    if (SocketMap.ContainsKey(receiveState.RemoteHost))
                    {
                        var connection = SocketMap[receiveState.RemoteHost];
                        CloseConnection(connection);
                    }
                    return;
                }

                var remoteAddress = (IPEndPoint)RemoteEndPoint;

                if (receiveState.RemoteHost.IsEmpty())
                {
                    receiveState.RemoteHost = remoteAddress.ToNode(TransportType.Udp);
                }

                ReactorResponseChannel adapter;
                if (SocketMap.ContainsKey(receiveState.RemoteHost))
                {
                    adapter = SocketMap[receiveState.RemoteHost];
                }
                else
                {
                    adapter = new ReactorProxyResponseChannel(this, receiveState.Socket, remoteAddress,
                                                              EventLoop.Clone(ProxiesShareFiber));
                    ;
                    SocketMap.Add(adapter.RemoteHost, adapter);
                    NodeConnected(adapter.RemoteHost, adapter);
                }

                receiveState.Buffer.WriteBytes(receiveState.RawBuffer, 0, received);

                List <IByteBuf> decoded;
                Decoder.Decode(ConnectionAdapter, receiveState.Buffer, out decoded);

                foreach (var message in decoded)
                {
                    var networkData = NetworkData.Create(receiveState.RemoteHost, message);
                    ReceivedData(networkData, adapter);
                }

                //reuse the buffer
                if (receiveState.Buffer.ReadableBytes == 0)
                {
                    receiveState.Buffer.SetIndex(0, 0);
                }
                else
                {
                    receiveState.Buffer.CompactIfNecessary();
                }

                receiveState.Socket.BeginReceiveFrom(receiveState.RawBuffer, 0, receiveState.RawBuffer.Length,
                                                     SocketFlags.None, ref RemoteEndPoint, ReceiveCallback, receiveState); //receive more messages
            }
            catch (SocketException ex)                                                                                     //node disconnected
            {
                var connection = SocketMap[receiveState.RemoteHost];
                CloseConnection(ex, connection);
            }
            catch (ObjectDisposedException ex)
            {
                if (SocketMap.ContainsKey(receiveState.RemoteHost))
                {
                    var connection = SocketMap[receiveState.RemoteHost];
                    CloseConnection(ex, connection);
                }
            }
            catch (Exception ex)
            {
                var connection = SocketMap[receiveState.RemoteHost];
                OnErrorIfNotNull(ex, connection);
            }
        }