コード例 #1
0
        private void btnLogin_Click(object sender, EventArgs e)
        {
            _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            {
                ReceiveTimeout = 30 * 1000,
                SendTimeout    = 30 * 1000
            };
            _clientSocket.Connect(new IPEndPoint(IPAddress.Parse(txtIP.Text), POC_NET_TCP_PORT));

            tvGroup.Nodes.Clear();
            lvGroup.Items.Clear();

            //登录参数
            user = new EvrcProtocal.stUser
            {
                iSetPar =
                {
                    ip      = txtIP.Text,
                    account = txtUsr.Text,
                    passwd  = txtPwd.Text
                }
            };
            //1、获取登录
            _sendbuff = new byte[1000];
            var loginpack = EvrcProtocal.proto_make_login_packet(ref user, ref _sendbuff[0]);

            _clientSocket.Send(_sendbuff, loginpack, SocketFlags.None);
            _recvbuff = new byte[1000];
            int  len  = _clientSocket.Receive(_recvbuff, 1000, SocketFlags.None);
            uint vlen = 0;

            byte[] checkedrtn = CrcCheck(_recvbuff, len, ref vlen);//CRC校验
            //登录解包(此处回填登录参数)
            var loginunpack = EvrcProtocal.proto_unpack_login_ack(ref user, ref checkedrtn[5], vlen - 5);
            var name        = TrimStr(Encoding.UTF8.GetString(user.username));

            ShowMsg("登陆解包res:" + (loginunpack != 0) + ";uid=" + user.uid + ";username="******";defaultgroup=" + user.default_group);

            //2、获取组
            _sendbuff = new byte[1000];
            var reqgroup = EvrcProtocal.proto_make_query_group_packet(ref _sendbuff[0]);

            //ShowMsg("获取组结果:" + reqgroup);
            _clientSocket.Send(_sendbuff, reqgroup, SocketFlags.None);
            _recvbuff  = new byte[1000];
            len        = _clientSocket.Receive(_recvbuff, 1000, SocketFlags.None);
            checkedrtn = CrcCheck(_recvbuff, len, ref vlen);//CRC校验
            //解包组
            var upkgroup = EvrcProtocal.proto_unpack_query_group_ack(ref checkedrtn[5], vlen - 5);

            ShowMsg("获取组解包res:" + (upkgroup != 0));

            //0、进入群组
            _sendbuff = new byte[1000];
            var entg = EvrcProtocal.proto_make_enter_group_packet(user.default_group, ref _sendbuff[0]);

            //ShowMsg("进入群组结果:"+entg);
            _clientSocket.Send(_sendbuff, entg, SocketFlags.None);
            _recvbuff  = new byte[1000];
            len        = _clientSocket.Receive(_recvbuff, 1000, SocketFlags.None);
            checkedrtn = CrcCheck(_recvbuff, len, ref vlen);//CRC校验
            //解包进入群组
            var entgack = EvrcProtocal.proto_unpack_enter_group_ack(ref checkedrtn[5], vlen - 5);

            ShowMsg("进入群组解包res:" + (entgack != 0));

            //3、解析组
            var gl        = EvrcProtocal.proto_get_group_list();
            var grouplist = (EvrcProtocal.stGroupList)Marshal.PtrToStructure(gl, typeof(EvrcProtocal.stGroupList));

            ShowMsg("获取组结果:组数" + grouplist.uiTotal);
            var nowhead = grouplist.pHead;
            var now     = (EvrcProtocal.stGroupNode)Marshal.PtrToStructure(nowhead, typeof(EvrcProtocal.stGroupNode));

            while (true)
            {
                if (now == null)
                {
                    break;
                }
                var name1 = TrimStr(Encoding.UTF8.GetString(now.iGroup.gname));
                ShowMsg("解析组:gid=" + now.iGroup.gid + ";gname=" + name1 + ";number_n=" + now.iGroup.number_n);
                tvGroup.Nodes.Add(now.iGroup.gid.ToString(), name1);

                //4、根据组获取用户
                _sendbuff = new byte[1000];
                var mbr = EvrcProtocal.proto_make_query_member_packet(now.iGroup.gid, ref _sendbuff[0]);//now.iGroup.gid|user.default_group
                _clientSocket.Send(_sendbuff, mbr, SocketFlags.None);
                _recvbuff  = new byte[1000];
                len        = _clientSocket.Receive(_recvbuff, 1000, SocketFlags.None);
                checkedrtn = CrcCheck(_recvbuff, len, ref vlen);//CRC校验
                var dembr = EvrcProtocal.proto_unpack_query_member_ack(ref checkedrtn[5], vlen - 5);
                ShowMsg("解包用户res:" + (dembr != 0));

                var ml      = EvrcProtocal.proto_get_user_list();
                var mbrlist = (EvrcProtocal.stUserList)Marshal.PtrToStructure(ml, typeof(EvrcProtocal.stUserList));

                ShowMsg("获取用户结果:用户数" + mbrlist.uiTotal);
                var head   = mbrlist.pHead;
                var mbrnow = (EvrcProtocal.stUserNode)Marshal.PtrToStructure(head, typeof(EvrcProtocal.stUserNode));
                while (true)
                {
                    if (mbrnow == null)
                    {
                        break;
                    }
                    var name2 = TrimStr(Encoding.UTF8.GetString(mbrnow.uname));
                    ShowMsg("解析用户:uid=" + mbrnow.uid + ";online=" + mbrnow.online + ";uname=" + name2);
                    tvGroup.Nodes.Find(now.iGroup.gid.ToString(), false)[0].Nodes.Add(mbrnow.uid.ToString(), name2);

                    mbrnow = (EvrcProtocal.stUserNode)Marshal.PtrToStructure(mbrnow.pNext, typeof(EvrcProtocal.stUserNode));
                }
                now = (EvrcProtocal.stGroupNode)Marshal.PtrToStructure(now.pNext, typeof(EvrcProtocal.stGroupNode));
            }
            tvGroup.ExpandAll();
            PubUser           = user;
            btnDo.Enabled     = true;
            btnLogin.Enabled  = false;
            btnLogout.Enabled = true;
        }