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; }