public void StartServer() { BindIps(); new Action(() => { while (true) { IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint remote = (EndPoint)sender; int len = 0; byte[] buffer = null; int offset = 0; var bufferindex = _buffermanager.GetBuffer(); if (bufferindex == -1) { throw new Exception("没有可用的接收缓存"); } if (bufferindex != -1) { buffer = _buffermanager.Buffer; offset = _buffermanager.GetOffset(bufferindex); len = __s.ReceiveFrom(buffer, offset, MAX_PACKAGE_LEN, SocketFlags.None, ref remote); } if (len > 8) { OnSocket(remote, bufferindex, len); } else { try { var locker = GetSendMsgLocker((IPEndPoint)remote); if (locker != null) { var bagid = BitConverter.ToInt64(buffer, offset); //Console.WriteLine(Environment.TickCount + ":收确认:" + segmentid); if (locker.BagId == bagid) { locker.Set(); } } } finally { _buffermanager.RealseBuffer(bufferindex); } } } }).BeginInvoke(null, null); }
private void CheckBufferPoll(int willwritecount) { if (!_needcheckbuffuer) { return; } if (_ms.Position + willwritecount > _bufferPollManager.BlockSize) { var pos = _ms.Position; var newms = new System.IO.MemoryStream(); newms.Write(_bufferPollManager.Buffer, (int)_bufferoffset, (int)pos); _ms.Close(); _ms.Dispose(); _bufferPollManager.RealseBuffer(Bufferindex); Bufferindex = -1; _bufferPollManager = null; _ms = newms; _needcheckbuffuer = false; } }
private void RealseSocketAsyncEventArgs(IOCPSocketAsyncEventArgs e) { e.Completed -= SocketAsyncEventArgs_Completed; _bufferpoll.RealseBuffer(e.BufferIndex); e.ClearBuffer(); //e.AcceptSocket.Disconnect(true); try { e.AcceptSocket.Shutdown(SocketShutdown.Send); } catch { } e.AcceptSocket.Close(); e.AcceptSocket = null; _iocpQueue.Enqueue(e); }
public static int SendMessage(this Socket s, Message message, string encrykey) { try { if (s == null) { return(0); } byte[] data = null; int bufferindex = -1; long size = 0; if (string.IsNullOrWhiteSpace(encrykey)) { EntityBuf.EntityBufCore.Serialize(message, _sendBufferManger, ref bufferindex, ref size, ref data); } else { data = EntityBuf.EntityBufCore.Serialize(message); } if (bufferindex == -1) { if (!string.IsNullOrWhiteSpace(encrykey)) { using (var ms = new System.IO.MemoryStream()) { for (int i = 0; i < 8; i++) { ms.WriteByte(0); } var enbytes = AesEncryHelper.AesEncrypt(data, encrykey); ms.Write(enbytes, 0, enbytes.Length); data = ms.ToArray(); } } byte[] dataLen = BitConverter.GetBytes(data.Length - 4); for (int i = 0; i < 4; i++) { data[i] = dataLen[i]; } var crc32 = HashEncrypt.GetCRC32(data, 8); //LogManager.LogHelper.Instance.Debug("校验值:" + crc32); var crc32bytes = BitConverter.GetBytes(crc32); for (int i = 4; i < 8; i++) { data[i] = crc32bytes[i - 4]; } lock (s) { var sendcount = s.Send(data, SocketFlags.None); //if (SocketApplicationEnvironment.TraceSocketDataBag && !string.IsNullOrWhiteSpace(message.MessageHeader.TransactionID)) //{ // LogManager.LogHelper.Instance.Debug(s.Handle + "发送数据:" + message.MessageHeader.TransactionID + "长度:" + data.Length + ", " + Convert.ToBase64String(data)); //} return(sendcount); } } else { try { //LogManager.LogHelper.Instance.Error("发送数据bufferindex:" + bufferindex + ",size:" + size); byte[] dataLen = BitConverter.GetBytes((int)size - 4); int offset = _sendBufferManger.GetOffset(bufferindex); for (int i = 0; i < 4; i++) { _sendBufferManger.Buffer[i + offset] = dataLen[i]; } var crc32 = HashEncrypt.GetCRC32(_sendBufferManger.Buffer, offset + 8, (int)size - 8); //LogManager.LogHelper.Instance.Debug("校验值:" + crc32); var crc32bytes = BitConverter.GetBytes(crc32); for (int i = 4; i < 8; i++) { _sendBufferManger.Buffer[i + offset] = crc32bytes[i - 4]; } int sendcount = 0; lock (s) { SocketError senderror = SocketError.Success; sendcount = s.Send(_sendBufferManger.Buffer, offset, (int)size, SocketFlags.None, out senderror); //if (SocketApplicationEnvironment.TraceSocketDataBag && !string.IsNullOrWhiteSpace(message.MessageHeader.TransactionID)) //{ // var sendbytes = _sendBufferManger.Buffer.Skip(offset).Take((int)size).ToArray(); // LogManager.LogHelper.Instance.Debug(s.Handle + "发送数据:" + message.MessageHeader.TransactionID + "长度:" + size + ", " + Convert.ToBase64String(sendbytes)); //} if (senderror != SocketError.Success) { throw new Exception(senderror.ToString()); } } return(sendcount); } finally { _sendBufferManger.RealseBuffer(bufferindex); } } } catch (Exception ex) { ex.Data.Add("TransactionID", message.MessageHeader.TransactionID); throw new SocketApplicationException("SendMessage fail", ex); } }
public static void TestGZIP() { BufferPollManager poll = new BufferPollManager(100, 1024 * 1000); string str = "我是中国人的,我常常爱着我的祖asfdgefaserfaTimeout 时间已到。"; RunConfig rc = new RunConfig(); rc.CmdPhoneNumber = str; rc.DefaultEmailAccount = str; rc.DefaultEmailPwd = str; rc.DefaultReciveEmailAccount = str; rc.ID = 12456; rc.StopEarn = 12.0; rc.CmdPhoneNumber = str; byte[] bytes = null; var utf8bytes = Encoding.UTF8.GetBytes(str); var cputf8bytes = GZip.Compress(utf8bytes); System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); bytes = LJC.FrameWork.EntityBuf.EntityBufCore.Serialize(rc); sw.Restart(); int bufferindex = -1; long size = 0; for (int i = 0; i < 100000; i++) { //string str1 = JsonUtil<object>.Serialize(rc); //var obj = JsonUtil<RunConfig>.Deserialize(str1); LJC.FrameWork.EntityBuf.EntityBufCore.Serialize(rc, poll, ref bufferindex, ref size, ref bytes);// Encoding.UTF8.GetBytes(str); //LJC.FrameWork.EntityBuf.EntityBufCore.Serialize(rc); if (bytes == null) { } else { poll.RealseBuffer(bufferindex); } } sw.Stop(); Console.WriteLine("序列化用时" + sw.ElapsedMilliseconds); Console.WriteLine("原始长度:" + bytes.Length); return; byte[] commpressbytes = null, decompressbytes = null; sw.Restart(); for (int i = 0; i < 10000; i++) { commpressbytes = GZip.Compress(bytes); } sw.Stop(); Console.WriteLine("压缩用时" + sw.ElapsedMilliseconds + ",压缩后长度:" + commpressbytes.Length); sw.Restart(); for (int i = 0; i < 10000; i++) { decompressbytes = GZip.Decompress(commpressbytes); } sw.Stop(); Console.WriteLine("解压缩用时" + sw.ElapsedMilliseconds + ",解压缩后长度" + decompressbytes.Length); Console.Read(); }