Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 4
0
        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);
            }
        }