Ejemplo n.º 1
0
        /// <summary>
        /// UdpClient 收到数据
        /// </summary>
        /// <param name="ar">Ar.</param>
        private void OnReceive(IAsyncResult ar)
        {
            UdpClient client = (UdpClient)ar.AsyncState;

            lock (LOCK_OBJECT) {
                try {
                    // 不是当前连接
                    if (client != m_client)
                    {
                        client.Close();
                        return;
                    }

                    IPEndPoint remoteEP = null;
                    Byte[]     data     = client.EndReceive(ar, ref remoteEP);
                    m_kcp.Input(data);
                    for (int size = m_kcp.PeekSize(); size > 0; size = m_kcp.PeekSize())
                    {
                        var buffer = new byte[size];
                        if (m_kcp.Recv(buffer) > 0)
                        {
                            m_msgProtocol.Receive(buffer, buffer.Length);
                        }
                    }
                    m_updateDirty = true;

                    // 继续等待异步 OnReceive
                    m_client.BeginReceive(new AsyncCallback(OnReceive), m_client);
                } catch (Exception e) {
                    Close("Error - OnReceive: " + e.Message);
                }
            }
        }