private void SendUpdateStatePacket(UpdateState state, User user, IPAddress brdIp)
        {
            UdpPacket packet = new UdpPacket();

            packet.Address = user.Address;
            packet.Port    = user.Port;
            packet.ToMAC   = "";
            packet.FromMAC = user.ID;
            packet.Command = UdpPacket.CMD_STATE;

            UdpPacketUserStateExtend entryExtend = new UdpPacketUserStateExtend();

            entryExtend.User        = user;
            entryExtend.UpdateState = state;

            packet.Extend = entryExtend;

            UdpPacket packetWrap = new UdpPacket();

            packetWrap.Address = brdIp;
            packetWrap.Port    = this.Port;
            packetWrap.ToMAC   = "";
            packetWrap.FromMAC = this.MAC;
            packetWrap.Command = UdpPacket.CMD_RETRANSMIT;

            IPacketEncoder encoder = PacketEncoderFactory.CreateEncoder(packet);
            EncodeResult   result  = encoder.Encode();

            UdpPacketRetransExtend extend = new UdpPacketRetransExtend(result.Fragments[0]);

            packetWrap.Extend = extend;

            _client.Send(packetWrap);
        }
        private void UserUpdateState(UdpPacket packet)
        {
            UdpPacketUserStateExtend extend = packet.Extend as UdpPacketUserStateExtend;

            //更新用户状态
            ClientUser user = this[packet.FromMAC];

            user.Update(extend.User, extend.UpdateState);

            //用户一览信息回给上线者
            UdpPacket packetUsers = new UdpPacket();

            packetUsers.Address = packet.Address;
            packetUsers.Port    = packet.Port;
            packetUsers.ToMAC   = packet.FromMAC;
            packetUsers.FromMAC = this.MAC;
            packetUsers.Command = UdpPacket.CMD_USER_LIST;
            UdpPacketUserListExtend extendUserList = new UdpPacketUserListExtend();

            packetUsers.Extend = extendUserList;
            foreach (User u in _users)
            {
                extendUserList.AddUser(u);
            }
            _client.Send(packetUsers);

            //上线信息广播给各位
            foreach (IPAddress brdIp in LanServerConfig.Instance.BroadcastAddress)
            {
                SendUpdateStatePacket(extend.UpdateState, user, brdIp);
                Thread.Sleep(50);
            }
        }
        private static void EncodeEntryExtend(BinaryWriter wtr, UdpPacket packet)
        {
            UdpPacketUserStateExtend extend = packet.Extend as UdpPacketUserStateExtend;

            if (extend == null)
            {
                throw new Exception("[EncodeEntryExtend]未想定附加包");
            }
            User user = extend.User;

            wtr.Write((int)extend.UpdateState);

            if ((extend.UpdateState & UpdateState.PublicKey) != 0)
            {
                byte[] keyBuf = user.SecurityKeys.Public;
                wtr.Write(keyBuf.Length);
                wtr.Write(keyBuf);
            }
            if ((extend.UpdateState & UpdateState.NickName) != 0)
            {
                wtr.Write(user.NickName);
            }
            if ((extend.UpdateState & UpdateState.Status) != 0)
            {
                wtr.Write((int)user.Status);
            }
            if ((extend.UpdateState & UpdateState.Photo) != 0)
            {
                if (user.ProfilePhoto == null)
                {
                    wtr.Write(0);
                }
                else
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        user.ProfilePhoto.Save(ms, ImageFormat.Png);
                        wtr.Write((int)ms.Length);
                        byte[] buf = ms.ToArray();
                        wtr.Write(buf);
                    }
                }
            }
            if ((extend.UpdateState & UpdateState.IP) != 0)
            {
                wtr.Write(user.Address.ToString());
            }
            if ((extend.UpdateState & UpdateState.Port) != 0)
            {
                wtr.Write(user.Port);
            }
        }
Exemple #4
0
        private static UdpPacketUserStateExtend ResolveEntryExtend(BinaryReader rdr, ulong command)
        {
            UdpPacketUserStateExtend extend = new UdpPacketUserStateExtend();

            extend.UpdateState = (UpdateState)rdr.ReadInt32();

            User user = new User();

            extend.User = user;

            if ((extend.UpdateState & UpdateState.PublicKey) != 0)
            {
                int len = rdr.ReadInt32();
                user.SecurityKeys.Public = rdr.ReadBytes(len);
            }
            if ((extend.UpdateState & UpdateState.NickName) != 0)
            {
                user.NickName = rdr.ReadString();
            }
            if ((extend.UpdateState & UpdateState.Status) != 0)
            {
                user.Status = (UserStatus)rdr.ReadInt32();
            }
            if ((extend.UpdateState & UpdateState.Photo) != 0)
            {
                int len = rdr.ReadInt32();
                if (len != 0)
                {
                    byte[] buf = rdr.ReadBytes(len);
                    using (MemoryStream ms = new MemoryStream(buf))
                    {
                        user.ProfilePhoto = Image.FromStream(ms);
                    }
                }
            }
            if ((extend.UpdateState & UpdateState.IP) != 0)
            {
                user.Address = IPAddress.Parse(rdr.ReadString());
            }
            if ((extend.UpdateState & UpdateState.Port) != 0)
            {
                user.Port = rdr.ReadInt32();
            }
            return(extend);
        }