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 }
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); } }
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); } }