Пример #1
0
        public bool Start()
        {
            try
            {
                //if (clientSocket != null)
                //{
                //    clientSocket.Close();
                //}
                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                clientSocket.Connect(LinkIp, LinkId);

                LinkState = true;

                ClientDispatcher.Debug($"连接成功 {Desc} {LinkType} {LinkIp} {LinkId}!");

                //连接后开始从服务器读取网络消息
                clientSocket.BeginReceive(ReadM, recvoffest, 65536 - recvoffest, SocketFlags.None, new System.AsyncCallback(ReceiveCallBack), ReadM);

                return(true);
            }
            catch (SocketException)
            {
                clientSocket = null;

                LinkState = false;
                //网络连接异常

                ClientDispatcher.Error($"连接失败 {Desc} {LinkType} {LinkIp} {LinkId}!");

                return(false);
            }
        }
Пример #2
0
        private int DeCodePacket(ref byte[] buf, ref int recvOffest)
        {
            int decodeOffest = 0;
            int datalen      = 0;
            int head         = 0;

            while (recvOffest - decodeOffest >= 6)
            {
                datalen = BitConverter.ToInt32(buf, decodeOffest);
                head    = BitConverter.ToUInt16(buf, decodeOffest + 4);
                if (head < 0 || head > 65536)
                {
                    ClientDispatcher.Error($"出现Socket head异常");
                    return(0);
                }
                //if (datalen  < 0 || datalen > 65536)
                //{
                //    ClientDispatcher.Error($"出现Socket datalen 异常");
                //    return 0;
                //}

                if (datalen > recvOffest - (decodeOffest + 4))
                {
                    //continue recv packet
                    break;
                }

                decodeOffest += 4;
                byte[] buffer = new byte[datalen];
                Buffer.BlockCopy(buf, decodeOffest, buffer, 0, datalen);
                decodeOffest += datalen;

                ListReq.Enqueue(buffer);
                //ClientDispatcher.OnReceiveData(buffer);
                StopwatchProcess.Stop();
                var UseMs = StopwatchProcess.ElapsedMilliseconds;
                if (UseMs > maxMs)
                {
                    maxMs = UseMs;
                    ClientDispatcher.Debug($"消息处理最大耗时:{maxMs}毫秒");
                }
            }

            if (decodeOffest > 0 && decodeOffest < recvOffest)
            {
                Buffer.BlockCopy(buf, decodeOffest, buf, 0, recvOffest - decodeOffest);
            }

            recvOffest = recvOffest - decodeOffest;

            return(1);
        }