コード例 #1
0
        public void Send()
        {
            if (sendBuffer.Length <= 0)//没有任何数据
            {
                return;
            }

            try
            {
                //SysSocket.BeginSend(sendBuffer.ToArray(), 0, sendBuffer.Count, SocketFlags.None, null, null);
                int realSendLen = sysSocket.Send(sendBuffer.Buffer, sendBuffer.Start, sendBuffer.Length, SocketFlags.None);
                //LastTickSend += realSendLen;

                if (realSendLen == sendBuffer.Length)
                {
                    //if (sendBuffer.Length >= 1024 * 4)
                    //{
                    //    if (endPoint < sendBuffer.Length / 4) //一直达不到25%使用率,会释放掉一般空间
                    //    {
                    //        shrinkHint++;
                    //        if (shrinkHint == 5)
                    //        {
                    //            sendBuffer = new byte[sendBuffer.Length / 4];
                    //            shrinkHint = 0;
                    //        }
                    //    }
                    //    else
                    //    {
                    //        shrinkHint = 0;
                    //    }
                    //}
                    sendBuffer.Reset();
                }
                else
                {
                    sendBuffer.Pop(realSendLen);
                }
            }
            catch (SocketException e)
            {
                if (e.ErrorCode != 10035) //WSAEWOULDBLOCK,这个错误调试时会出现
                {
                    Log.Debug("UXSocket.SendData error connectId={0} errorCode={1} msg={2}", Id, e.ErrorCode, e.Message);
                }

                if (UserId > 0 || e.ErrorCode == 10054 || e.ErrorCode == 10053 || e.ErrorCode == 10058)//UserId > 0主要是客户端,10054是远程强制关闭的情况
                {
                    sendBuffer.Reset();
                    DefferedClose = true;
                }
            }
            catch (Exception e)
            {
                sendBuffer.Reset();
                Log.Warn("UXSocket.SendData error={0}", e);
                DefferedClose = true;
            }
        }
コード例 #2
0
        // io thread schedules this entrance
        private void OnReceivedCallback(IAsyncResult ar)
        {
            int bytesRead = 0;

            try
            {
                if (sysSocket != null)
                {
                    bytesRead = sysSocket.EndReceive(ar);
                }
            }
            catch (ObjectDisposedException e)
            {
                Log.Debug("UXSocket.ReceiveCallback objectDisposedException connectId={0}", Id);
                DefferedClose = true;
                return;
            }
            catch (SocketException e)
            {
                Log.Debug("UXSocket.ReceiveCallback connectId={0} errorCode={1} errorMessage={2}", Id, e.ErrorCode, e.Message);
                if (/*UserId > 0 || */ e.ErrorCode == 10054 || e.ErrorCode == 10053 || e.ErrorCode == 10058) //socket断开等严重错误,强制断开
                {
                    DefferedClose = true;
                }
                return;
            }
            catch (Exception)
            {
                Log.Error("UXSocket.ReceiveCallback exception connectId={0}", Id);//这些错误是未知
                DefferedClose = true;
                return;
            }

            if (bytesRead == 0)
            {
                Log.Debug("UXSocket.ReceiveCallback  read is 0 connectId={0} userId={1}", Id, UserId);
                //if (UserId > 0) //只会尝试断开外部连接
                //{
                //    WaitClose = true;
                //}
                //需要return,因为mono下receive会同步回调,导致卡死
                return;
            }

            receiveBuffer.Peek(bytesRead);
            //LastTickReceive += bytesRead;

            while (receiveBuffer.Length >= HeadLen)
            {
                int size = BitConverter.ToInt32(receiveBuffer.Buffer, receiveBuffer.Start);//todo 这里出过异常 gate

                if (size < 0)
                {
                    Log.Warn("UXSocket.ReceiveCallback size={0} id={1} pkgBufferIndex={2} pkgBufferFinish={3} pkgBufferLen={4} bytesRead={5}", size, Id, readBufferEnd, readBufferBegin, readBuffer.Length, bytesRead);
                    break;
                }

                if (receiveBuffer.Length >= size + HeadLen)
                {
                    byte[] destBuffer = null;

                    destBuffer = new byte[size];
                    Buffer.BlockCopy(receiveBuffer.Buffer, receiveBuffer.Start + HeadLen, destBuffer, 0, size);

                    if (rc4Read != null) //做数据拆包前解密数据包
                    {
                        rc4Read.Encrypt(destBuffer, size);
                    }

                    receiveBuffer.Pop(size + HeadLen);

                    //if (readBufferBegin >= readBuffer.Length / 2) //大于一半的buffer数据已经处理后把不用的数据清理一次
                    //{
                    //    readBufferEnd -= readBufferBegin;
                    //    Buffer.BlockCopy(readBuffer, readBufferBegin, readBuffer, 0, readBufferEnd);
                    //    readBufferBegin = 0;
                    //}

                    try
                    {
                        MessageQueueEnqueue(destBuffer, size);
                    }
                    catch (Exception e)
                    {
                        Log.Error(e);
                    }
                }
                else
                {
                    // 如果剩下的数据还没有形成完整的包,等待下次接受后继续处理
                    break;
                }
            }
            Receive();
        }