Пример #1
0
    private void OnSend(IAsyncResult ar)
    {
        ar.AsyncWaitHandle.Close();
        SendRecvBuffer buffer = (SendRecvBuffer)ar.AsyncState;

        //已经断开连接
        if (buffer.Socket == null || !buffer.Socket.Connected)
        {
            this.Close();
            return;
        }

        try
        {
            buffer.Socket.EndSend(ar);
            m_buffer_pools.Despawn(buffer);
        }
        catch (Exception e)
        {
            Log.Exception(e);
            this.Close();
        }
    }
Пример #2
0
    /// <summary>
    /// 接收数据
    /// </summary>
    private void OnReceive(IAsyncResult ar)
    {
        if (m_socket == null)
        {
            return;
        }

        SendRecvBuffer buffer = (SendRecvBuffer)ar.AsyncState;

        ar.AsyncWaitHandle.Close();
        try
        {
            if (buffer.Socket == null)
            {
                return;
            }
            lock (m_sync_lock)
            {
                if (!m_user_tokens.ContainsKey(buffer.ConnId))
                {
                    return;
                }
                int len = buffer.Socket.EndReceive(ar);
                if (len > 0)
                {
                    if (OnMessage != null)
                    {
                        OnMessage(buffer.ConnId, buffer.Buffer, len);
                    }

                    //派发消息的时候,有可能上层逻辑关闭了当前连接,必须再判断一次当前连接是否正常
                    if (m_user_tokens.ContainsKey(buffer.ConnId))
                    {
                        this.BeginReceive(buffer);
                    }
                    else
                    {
                        m_buffer_pools.Despawn(buffer);
                    }
                }
                else
                {
                    Log.Error("OnReceive Recv Error");
                    m_buffer_pools.Despawn(buffer);
                    this.CloseClientSocket(buffer.ConnId);
                }
            }
        }
        catch (SocketException e)
        {
            if (e.ErrorCode != 10054)
            {
                Log.Exception(e);
            }
            m_buffer_pools.Despawn(buffer);
            this.CloseClientSocket(buffer.ConnId);
        }
        catch (Exception e)
        {
            Log.Exception(e);
            m_buffer_pools.Despawn(buffer);
            this.CloseClientSocket(buffer.ConnId);
            return;
        }
    }