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); }
internal void CreateNewSendDataHolder() { this.sendDataHolder = new SendDataHolder(); }