Ejemplo n.º 1
0
        internal static void GetDataToSend(SocketAsyncEventArgs e)
        {
            ClientUserToken theUserToken = (ClientUserToken)e.UserToken;
            SendDataHolder  dataHolder   = theUserToken.sendDataHolder;

            //In this example code, we will
            //prefix the message with the length of the message. So we put 2
            //things into the array.
            // 1) prefix,
            // 2) the message.

            //Determine the length of the message that we will send.
            int lengthOfCurrentOutgoingMessage = dataHolder.ArrayOfMessageToSend[dataHolder.NumberOfMessageHadSent].Content.Length;

            //convert the message to byte array
            byte[] arrayOfBytesInMessage = dataHolder.ArrayOfMessageToSend[dataHolder.NumberOfMessageHadSent].Content;

            //So, now we convert the length integer into a byte array.
            //Aren't byte arrays wonderful? Maybe you'll dream about byte arrays tonight!
            byte[] arrayOfBytesInPrefix = BitConverter.GetBytes(lengthOfCurrentOutgoingMessage);

            //Create the byte array to send.
            theUserToken.dataToSend = new Byte[theUserToken.sendPrefixLength + lengthOfCurrentOutgoingMessage];

            theUserToken.messageTokenId = dataHolder.ArrayOfMessageToSend[dataHolder.NumberOfMessageHadSent].TokenId;

            //Now copy the 2 things to the theUserToken.dataToSend.
            Buffer.BlockCopy(arrayOfBytesInPrefix, 0, theUserToken.dataToSend, 0, theUserToken.sendPrefixLength);
            Buffer.BlockCopy(arrayOfBytesInMessage, 0, theUserToken.dataToSend, theUserToken.sendPrefixLength, lengthOfCurrentOutgoingMessage);

            theUserToken.sendBytesRemainingCount = theUserToken.sendPrefixLength + lengthOfCurrentOutgoingMessage;
            theUserToken.bytesSentAlreadyCount   = 0;
        }
        private bool ReuseHeartBeatSAEA(List <Message> messages, string serverEndPointKey)
        {
            try {
                if (!dictPoolOfHeartBeatRecSendEventArgs.ContainsKey(serverEndPointKey))
                {
                    return(false);
                }

                SocketAsyncEventArgPool thisPortSocketPool = dictPoolOfHeartBeatRecSendEventArgs[serverEndPointKey];

                //while (!thisPortSocketPool.IsEmpty)
                while (true)
                {
                    cleanSignal.Reset();

                    //鉴于IsEmpty有问题,确保有Pop尝试!
                    SocketAsyncEventArgs arg = thisPortSocketPool.Pop();

                    if (arg == null)
                    {
                        if (thisPortSocketPool.IsEmpty)
                        {
                            LogManager.LogTraceInfo(string.Format("poolKey:{0} 's pool empty now with count:{1}", serverEndPointKey, thisPortSocketPool.Count));
                            return(false);
                        }
                        else
                        {
                            Thread.Sleep(1);
                            continue;
                        }
                    }

                    GetSimplePerf().PerfClientReuseConnectionCounter.Increment();
                    GetSimplePerf().PerfClientIdleConnectionCounter.Decrement();

                    ClientUserToken userToken = (ClientUserToken)arg.UserToken;
                    userToken.CreateNewSendDataHolder();
                    SendDataHolder sendDataHodler = userToken.sendDataHolder;

                    sendDataHodler.SetSendMessage(messages);
                    MessagePreparer.GetDataToSend(arg);
                    sendDataHodler.ArrayOfMessageToSend[0].StartTime = DateTime.Now;

                    StartSend(arg);

                    return(true);
                }
            }
            catch (Exception pickErr) {
                LogManager.Log(string.Format("pick socket from poolKey:{0} occur error!", serverEndPointKey), pickErr);
            }
            finally {
                cleanSignal.Set();
            }

            return(false);
        }
Ejemplo n.º 3
0
 internal void CreateNewSendDataHolder()
 {
     this.sendDataHolder = new SendDataHolder();
 }