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 SetBuffer(IOCPSocketAsyncEventArgs e, int offset, int len) { if (offset > 0) { offset = (e.BufferIndex == -1 ? 0 : _bufferpoll.GetOffset(e.BufferIndex)) + offset; e.SetBuffer(offset, len); return; } byte[] buf = null; if (len <= _bufferpoll.BlockSize) { if (e.BufferIndex == -1) { var newindex = _bufferpoll.GetBuffer(); if (newindex == -1) { buf = new byte[len]; } else { e.BufferIndex = newindex; } } } else { if (e.BufferIndex > 0) { _bufferpoll.RealseBuffer(e.BufferIndex); e.BufferIndex = -1; } buf = new byte[len]; } if (buf != null) { e.SetBuffer(buf, offset, len); } else { e.SetBuffer(_bufferpoll.Buffer, _bufferpoll.GetOffset(e.BufferIndex) + offset, len); } }
public MemoryStreamWriter(BufferPollManager bufferpollmanger) { var bufferindex = bufferpollmanger.GetBuffer(); if (bufferindex == -1) { _ms = new MemoryStream(); } else { _bufferPollManager = bufferpollmanger; Bufferindex = bufferindex; _bufferoffset = bufferpollmanger.GetOffset(bufferindex); _ms = new MemoryStream(bufferpollmanger.Buffer, (int)_bufferoffset, bufferpollmanger.BlockSize); } //_ms.Position = 4; _ms.Position = 8; }
public static void Serialize(object o, BufferPollManager poolmanager, ref int bufferindex, ref long size, ref byte[] serbyte, bool compress = true) { MemoryStreamWriter writer = new MemoryStreamWriter(poolmanager); Serialize(o, writer); bufferindex = writer.Bufferindex; size = writer.GetDataLen(); if (bufferindex == -1) { serbyte = writer.GetBytes(); if (compress && size - 8 > minGZIPCompressLenth) { var compressBytes = GZip.Compress(serbyte.Skip(8).Take((int)size - 8).ToArray()); size = 8 + compressBytes.Length; serbyte = new byte[size]; for (int i = 0; i < compressBytes.Length; i++) { serbyte[i + 8] = compressBytes[i]; } } } else { if (compress && size - 8 > minGZIPCompressLenth) { var offset = poolmanager.GetOffset(bufferindex); var compressBytes = GZip.Compress(poolmanager.Buffer.Skip(offset + 8).Take((int)size - 8).ToArray()); size = 8 + compressBytes.Length; for (int i = 0; i < compressBytes.Length; i++) { poolmanager.Buffer[offset + 8 + i] = compressBytes[i]; } } } }
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); } }