Exemple #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);
        }
Exemple #2
0
        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);
            }
        }
Exemple #5
0
        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();
        }