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