public void Close() { lock (m_StateLock) { CoreLog.Debug("[TcpChannel OnClose] Start."); if (m_State == NetChannelState.Unknown || m_State == NetChannelState.Closed || m_State == NetChannelState.Closing || m_State == NetChannelState.Disconnected) { return; } m_State = NetChannelState.Closing; } Clear(); Interlocked.Exchange(ref m_IsSending, 0); m_SendingEventArgs.Completed -= OnSendCompleted; m_ReceiveEventArgs.Completed -= OnReceiveCompleted; m_ConnectionEventArgs.Completed -= OnConnectionComplete; m_ReceiveStream.Dispose(); m_SendingStream.Dispose(); CoreLog.Debug("[TcpChannel OnClose] Before socket shutdown and close."); try { m_Socket.Shutdown(SocketShutdown.Both); m_Socket.Close(); } catch { // ignored } finally { CoreLog.Debug("[TcpChannel OnClose] finally block."); m_Socket = null; lock (m_StateLock) { m_State = NetChannelState.Closed; } CoreLog.Debug("[TcpChannel OnClose] End."); } }
private void OnConnectionComplete(object sender, SocketAsyncEventArgs e) { // Connection failed. if (e.SocketError != SocketError.Success) { Close(); OnError("Connection failed. Error data is a SocketError.", e.SocketError); return; } // Connection succeeded. Start receiving things. lock (m_StateLock) { m_State = NetChannelState.Connected; } Handler.OnConnected(); Receive(); }
public void Connect(IPAddress remoteIP, int port) { if (remoteIP == null) { throw new ArgumentNullException(nameof(remoteIP)); } if (port < IPEndPoint.MinPort || port > IPEndPoint.MaxPort) { throw new ArgumentOutOfRangeException(nameof(port)); } NetChannelState?state = null; lock (m_StateLock) { if (m_State != NetChannelState.Disconnected) { state = m_State; } else { m_State = NetChannelState.Connecting; } } if (state != null) { Handler.OnError($"Cannot connect under state '{state}'.", null); return; } m_Socket = new Socket(remoteIP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); RemoteEndPoint = new IPEndPoint(remoteIP, port); m_SendingEventArgs.Completed += OnSendCompleted; m_ReceiveEventArgs.Completed += OnReceiveCompleted; m_ReceiveEventArgs.SetBuffer(m_ReceiveBuffer, 0, m_ReceiveBuffer.Length); m_ConnectionEventArgs.RemoteEndPoint = RemoteEndPoint; m_ConnectionEventArgs.Completed += OnConnectionComplete; m_Socket.ConnectAsync(m_ConnectionEventArgs); }