示例#1
0
        private void SendThread(object o)
        {
            List <byte[]> workList = new List <byte[]>(10);

            while (mSendWork)
            {
                if (!mSendWork)
                {
                    break;
                }

                if (mClientSocket == null || !mClientSocket.Connected)
                {
                    continue;
                }

                mSendSemaphore.WaitResource();
                if (mSendMsgQueue.Empty())
                {
                    continue;
                }

                mSendMsgQueue.MoveTo(workList);
                try
                {
                    for (int k = 0; k < workList.Count; ++k)
                    {
                        var msgObj = workList[k];
                        if (mSendWork)
                        {
                            mClientSocket.Send(msgObj, msgObj.Length, SocketFlags.None);
                        }
                    }
                }
                catch (ObjectDisposedException e)
                {
                    ReportSocketClosed(ESocketError.ERROR_1, e.Message);
                    break;
                }
                catch (Exception e)
                {
                    ReportSocketClosed(ESocketError.ERROR_2, e.Message);
                    break;
                }
                finally
                {
                    for (int k = 0; k < workList.Count; ++k)
                    {
                        var msgObj = workList[k];
                        StreamBufferPool.RecycleBuffer(msgObj);
                    }
                    workList.Clear();
                }
            }

            if (mStatus == SOCKSTAT.CONNECTED)
            {
                mStatus = SOCKSTAT.CLOSED;
            }
        }
示例#2
0
        private void SendThread(object o)
        {
            List <byte[]> workList = new List <byte[]>(10);

            while (mSendWork)
            {
                if (!mSendWork)
                {
                    break;
                }

                if (mClientSocket == null || !mClientSocket.Connected)
                {
                    continue;
                }

                mSendSemaphore.WaitResource();
                if (mSendMsgQueue.Empty()) // 没有消息会倒计时
                {
                    continue;
                }

                mSendMsgQueue.MoveTo(workList);
                try
                {
                    for (int k = 0; k < workList.Count; ++k)
                    {
                        var msgObj = workList[k];
                        if (mSendWork)
                        {
                            mClientSocket.Send(msgObj, msgObj.Length, SocketFlags.None);
                        }
                    }
                }
                catch (ArgumentNullException e) { // 不会发生的错误  需要发送的数据为空
                    ReportSocketConnected(ESocketError.ERROR_NEW_7, e.Message);
                    break;
                }
                catch (ObjectDisposedException e)//socket连接已经被释放掉
                {
                    ReportSocketConnected(ESocketError.ERROR_NEW_8, e.Message);
                    break;
                }
                catch (SocketException e)// 试图访问套接字时发生错误。
                {
                    ReportSocketConnected(ESocketError.ERROR_NEW_9, e.Message);
                    break;
                }
                //catch (Exception e)
                //{
                //    ReportSocketClosed(ESocketError.ERROR_2, e.Message);
                //    break;
                //}
                finally
                {
                    //for (int k = 0; k < workList.Count; ++k)
                    //{
                    //    var msgObj = workList[k];
                    //    StreamBufferPool.RecycleBuffer(msgObj);
                    //}
                    workList.Clear();
                }
            }

            if (mStatus == SOCKSTAT.CONNECTED)
            {
                mStatus = SOCKSTAT.CLOSED;
            }
        }