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