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); } }
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); }
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); } }
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); }
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; }
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); } }
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); } }