示例#1
0
        private void ProcessSend(SocketAsyncEventArgs receiveSendEventArgs)
        {
            ServerUserToken receiveSendToken = (ServerUserToken)receiveSendEventArgs.UserToken;

            if (receiveSendEventArgs.SocketError == SocketError.Success)
            {
                receiveSendToken.sendBytesRemainingCount = receiveSendToken.sendBytesRemainingCount - receiveSendEventArgs.BytesTransferred;

                if (receiveSendToken.sendBytesRemainingCount == 0)
                {
                    // If we are within this if-statement, then all the bytes in
                    // the message have been sent.
                    StartReceive(receiveSendEventArgs);
                }
                else
                {
                    receiveSendToken.bytesSentAlreadyCount += receiveSendEventArgs.BytesTransferred;
                    // So let's loop back to StartSend().
                    StartSend(receiveSendEventArgs);
                }
            }
            else
            {
                receiveSendToken.Reset();
                CloseClientSocket(receiveSendEventArgs);
            }
        }
示例#2
0
        private void Init(ServerSetting serverSetting)
        {
            this.bufferManager.InitBuffer();

            SocketAsyncEventArgs eventArgObjectForPool;

            for (int i = 0; i < serverSetting.maxSimultaneousConnectOps; i++)
            {
                eventArgObjectForPool = new SocketAsyncEventArgs();

                eventArgObjectForPool.Completed += new EventHandler <SocketAsyncEventArgs>(AcceptEventArg_Completed);

                this.poolOfAcceptEventArgs.Push(eventArgObjectForPool);
            }

            for (int i = 0; i < serverSetting.numberOfSaeaForRecSend; i++)
            {
                eventArgObjectForPool = new SocketAsyncEventArgs();

                this.bufferManager.SetBuffer(eventArgObjectForPool);

                eventArgObjectForPool.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);

                ServerUserToken userToken = new ServerUserToken(eventArgObjectForPool.Offset, eventArgObjectForPool.Offset + serverSetting.bufferSize, serverSetting.receivePrefixLength, serverSetting.sendPrefixLength);

                eventArgObjectForPool.UserToken = userToken;

                this.poolOfRecSendEventArgs.Push(eventArgObjectForPool);
            }

            simplePerf = new SimplePerformanceCounter(true, true);
        }
示例#3
0
        private void StartSend(SocketAsyncEventArgs receiveSendEventArgs)
        {
            ServerUserToken receiveSendToken = (ServerUserToken)receiveSendEventArgs.UserToken;

            if (receiveSendToken.sendBytesRemainingCount <= this.bufferSize)
            {
                receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetSend, receiveSendToken.sendBytesRemainingCount);
                Buffer.BlockCopy(receiveSendToken.dataToSend, receiveSendToken.bytesSentAlreadyCount, receiveSendEventArgs.Buffer, receiveSendToken.bufferOffsetSend, receiveSendToken.sendBytesRemainingCount);
            }
            else
            {
                receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetSend, this.bufferSize);
                Buffer.BlockCopy(receiveSendToken.dataToSend, receiveSendToken.bytesSentAlreadyCount, receiveSendEventArgs.Buffer, receiveSendToken.bufferOffsetSend, this.bufferSize);

                //We'll change the value of sendUserToken.sendBytesRemainingCount
                //in the ProcessSend method.
            }

            //post asynchronous send operation
            bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.SendAsync(receiveSendEventArgs);

            if (!willRaiseEvent)
            {
                ProcessSend(receiveSendEventArgs);
            }
        }
示例#4
0
        private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs)
        {
            if (acceptEventArgs.SocketError != SocketError.Success)
            {
                LoopToStartAccept();

                LogManager.Log(string.Format("SocketError:{0}", acceptEventArgs.SocketError));

                HandleBadAccept(acceptEventArgs);

                return;
            }

            GetSimplePerf().PerfConcurrentServerConnectionCounter.Increment();

            LoopToStartAccept();

            SocketAsyncEventArgs receiveSendEventArgs = this.poolOfRecSendEventArgs.Pop();

            ServerUserToken userToken = (ServerUserToken)receiveSendEventArgs.UserToken;

            userToken.CreateNewSessionId();

            receiveSendEventArgs.AcceptSocket = acceptEventArgs.AcceptSocket;

            userToken.CreateNewServerSession(receiveSendEventArgs);

            acceptEventArgs.AcceptSocket = null;
            this.poolOfAcceptEventArgs.Push(acceptEventArgs);

            StartReceive(receiveSendEventArgs);
        }
示例#5
0
        internal static void GetDataToSend(SocketAsyncEventArgs e, byte[] sendData)
        {
            ServerUserToken userToken = (ServerUserToken)e.UserToken;

            //一个sessionid可能包括多个receivetransmissionid
            byte[] idByteArray  = BitConverter.GetBytes(userToken.serverSession.ReceiveTransmissionId);
            byte[] sidByteArray = BitConverter.GetBytes(userToken.serverSession.SessionId);
            int    lengthOfCurrentFeedbackMessage = idByteArray.Length + sidByteArray.Length + sendData.Length;

            byte[] arrayOfBytesInPrefix = BitConverter.GetBytes(lengthOfCurrentFeedbackMessage);

            userToken.dataToSend = new byte[userToken.sendPrefixLength + lengthOfCurrentFeedbackMessage];

            Buffer.BlockCopy(arrayOfBytesInPrefix, 0, userToken.dataToSend, 0, userToken.sendPrefixLength);

            Buffer.BlockCopy(idByteArray, 0, userToken.dataToSend, userToken.sendPrefixLength, idByteArray.Length);
            Buffer.BlockCopy(sidByteArray, 0, userToken.dataToSend, userToken.sendPrefixLength + idByteArray.Length, sidByteArray.Length);

            if (sendData.Length > 0)
            {
                Buffer.BlockCopy(sendData, 0, userToken.dataToSend, userToken.sendPrefixLength + idByteArray.Length + sidByteArray.Length, sendData.Length);
            }

            userToken.sendBytesRemainingCount = userToken.sendPrefixLength + lengthOfCurrentFeedbackMessage;
            userToken.bytesSentAlreadyCount   = 0;
        }
示例#6
0
        private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs)
        {
            ServerUserToken receiveSendToken = (ServerUserToken)receiveSendEventArgs.UserToken;

            receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.bufferSize);

            bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs);

            if (!willRaiseEvent)
            {
                ProcessReceive(receiveSendEventArgs);
            }
        }
示例#7
0
        private void ProcessReceive(SocketAsyncEventArgs receiveSendEventArgs)
        {
            ServerUserToken receiveSendToken = (ServerUserToken)receiveSendEventArgs.UserToken;

            if (receiveSendEventArgs.SocketError != SocketError.Success)
            {
                if (receiveSendEventArgs.SocketError != SocketError.ConnectionReset)
                {
                    LogManager.Log(string.Format("ProcessReceive ERROR: {0}, receiveSendToken sessionid:{1}", receiveSendEventArgs.SocketError, receiveSendToken.serverSession.SessionId));
                }

                receiveSendToken.Reset();
                CloseClientSocket(receiveSendEventArgs);

                return;
            }

            if (receiveSendEventArgs.BytesTransferred == 0)
            {
                receiveSendToken.Reset();
                CloseClientSocket(receiveSendEventArgs);

                return;
            }

            int remainingBytesToProcess = receiveSendEventArgs.BytesTransferred;

            //LogManager.Log(string.Format("getlength:{0} on {1} with prefixDoneCount:{2}", remainingBytesToProcess, receiveSendEventArgs.AcceptSocket.RemoteEndPoint,receiveSendToken.receivedPrefixBytesDoneCount));

            if (receiveSendToken.receivedPrefixBytesDoneCount < this.receivePrefixLength)
            {
                bool getLengthInfoSuccessfully = false;

                remainingBytesToProcess = PrefixHandler.HandlePrefix(receiveSendEventArgs, receiveSendToken, remainingBytesToProcess, ref getLengthInfoSuccessfully);

                if (remainingBytesToProcess == 0)
                {
                    // We need to do another receive op, since we do not have
                    // the message yet, but remainingBytesToProcess == 0.
                    StartReceive(receiveSendEventArgs);

                    return;
                }
            }

            bool incomingTcpMessageIsReady = MessageHandler.HandleMessage(receiveSendEventArgs, receiveSendToken, remainingBytesToProcess);

            if (incomingTcpMessageIsReady == true)
            {
                if (receiveSendToken.dataMessageReceived != null && receiveSendToken.dataMessageReceived.Length > 0)
                {
                    byte[] processResult = this.dataProcessor(receiveSendToken.dataMessageReceived);

                    MessagePreparer.GetDataToSend(receiveSendEventArgs, processResult);

                    //开始下次接收
                    receiveSendToken.CreateNewServerSession(receiveSendEventArgs);
                    receiveSendToken.dataMessageReceived = null;
                    receiveSendToken.Reset();

                    //调整了Reset位置到此语句前面执行,这样确保一个连接多次发送不会出问题了
                    //即便processResult为byte[0],也会返回类似sessionid,transessionid头信息回客户端
                    StartSend(receiveSendEventArgs);
                }
                else
                {
                    if (!supportKeepAlive)
                    {
                        receiveSendToken.Reset();
                        CloseClientSocket(receiveSendEventArgs);
                        return;
                    }
                    else
                    {
                        //只是个万全做法,不应该有此逻辑,即传输内容为空!
                        receiveSendToken.CreateNewServerSession(receiveSendEventArgs);
                        receiveSendToken.dataMessageReceived = null;
                        receiveSendToken.Reset();

                        StartReceive(receiveSendEventArgs);
                    }
                }
            }
            else
            {
                receiveSendToken.receiveMessageOffset     = receiveSendToken.bufferOffsetReceive;
                receiveSendToken.recPrefixBytesDoneThisOp = 0;

                StartReceive(receiveSendEventArgs);
            }
        }