private static UdpPacketStateExtend ResolveEntryExtend(BinaryReader rdr, ulong command) { UdpPacketStateExtend extend = new UdpPacketStateExtend(); if ((command & UdpPacket.CMD_OPTION_STATE_PUBKEY) != 0) { int len = rdr.ReadInt32(); extend.PublicKey = rdr.ReadBytes(len); } if ((command & UdpPacket.CMD_OPTION_STATE_NICKNAME) != 0) { extend.NickName = rdr.ReadString(); } if ((command & UdpPacket.CMD_OPTION_STATE_STATUS) != 0) { extend.Status = (UserStatus)rdr.ReadInt32(); } if ((command & UdpPacket.CMD_OPTION_STATE_PROFILE_PHOTO) != 0) { int len = rdr.ReadInt32(); if (len != 0) { byte[] buf = rdr.ReadBytes(len); using (MemoryStream ms = new MemoryStream(buf)) { extend.ProfilePhoto = Image.FromStream(ms); } } } return(extend); }
private UpdateState UpdateContacter(UdpPacket packet) { UdpPacketStateExtend extend = packet.Extend as UdpPacketStateExtend; LanUser user = this[packet.FromMAC]; UpdateState updateState = 0; if ((packet.Command & UdpPacket.CMD_OPTION_STATE_PUBKEY) != 0) { user.SecurityKeys.Public = extend.PublicKey; updateState |= LanIM.UpdateState.PublicKey; } if ((packet.Command & UdpPacket.CMD_OPTION_STATE_NICKNAME) != 0) { user.NickName = extend.NickName; updateState |= LanIM.UpdateState.NickName; } if ((packet.Command & UdpPacket.CMD_OPTION_STATE_PROFILE_PHOTO) != 0) { ProfilePhotoPool.SetPhoto(user.ID, extend.ProfilePhoto); updateState |= LanIM.UpdateState.Photo; } if ((packet.Command & UdpPacket.CMD_OPTION_STATE_STATUS) != 0) { user.Status = extend.Status; updateState |= LanIM.UpdateState.Status; } if (user.Port != packet.Port) { user.Port = packet.Port; updateState |= LanIM.UpdateState.Port; } if (user.IP != packet.Address) { user.IP = packet.Address; updateState |= LanIM.UpdateState.IP; } return(updateState); }
private static void EncodeEntryExtend(BinaryWriter wtr, UdpPacket packet) { UdpPacketStateExtend extend = packet.Extend as UdpPacketStateExtend; if (extend == null) { throw new Exception("[EncodeEntryExtend]未想定附加包"); } if ((packet.Command & UdpPacket.CMD_OPTION_STATE_PUBKEY) != 0) { byte[] keyBuf = extend.PublicKey; wtr.Write(keyBuf.Length); wtr.Write(keyBuf); } if ((packet.Command & UdpPacket.CMD_OPTION_STATE_NICKNAME) != 0) { wtr.Write(extend.NickName); } if ((packet.Command & UdpPacket.CMD_OPTION_STATE_STATUS) != 0) { wtr.Write((int)extend.Status); } if ((packet.Command & UdpPacket.CMD_OPTION_STATE_PROFILE_PHOTO) != 0) { if (extend.ProfilePhoto == null) { wtr.Write(0); } else { using (MemoryStream ms = new MemoryStream()) { extend.ProfilePhoto.Save(ms, ImageFormat.Png); wtr.Write((int)ms.Length); byte[] buf = ms.ToArray(); wtr.Write(buf); } } } }
private void SendUpdateStatePacket(UpdateState state, IPAddress remote, int port, string mac) { //发送自己的信息,让发送方也更新 UdpPacket packetRsp = new UdpPacket(); packetRsp.Address = remote; packetRsp.Port = port; packetRsp.ToMAC = mac; packetRsp.FromMAC = this.MAC; packetRsp.Command = UdpPacket.CMD_STATE; UdpPacketStateExtend entryExtend = new UdpPacketStateExtend(); if ((state & LanIM.UpdateState.Photo) != 0) { packetRsp.Command |= UdpPacket.CMD_OPTION_STATE_PROFILE_PHOTO; entryExtend.ProfilePhoto = ProfilePhotoPool.GetPhoto(this.ID, false); } if ((state & LanIM.UpdateState.NickName) != 0) { packetRsp.Command |= UdpPacket.CMD_OPTION_STATE_NICKNAME; entryExtend.NickName = this.NickName; } if ((state & LanIM.UpdateState.PublicKey) != 0) { packetRsp.Command |= UdpPacket.CMD_OPTION_STATE_PUBKEY; entryExtend.PublicKey = _client.SecurityKeys.Public; } if ((state & LanIM.UpdateState.Status) != 0) { packetRsp.Command |= UdpPacket.CMD_OPTION_STATE_STATUS; entryExtend.Status = this.Status; } packetRsp.Extend = entryExtend; _client.Send(packetRsp); }
//发送上线 public void Login() { foreach (IPAddress broadcastAddr in this.BroadcastAddress) { //先发送一个空操作,以防失败 SendEmptyPacket(broadcastAddr); Thread.Sleep(100); UdpPacket packet = new UdpPacket(); packet.Address = broadcastAddr; packet.Port = this.Port; packet.ToMAC = string.Empty; packet.Command = UdpPacket.CMD_ENTRY | UdpPacket.CMD_OPTION_STATE_NICKNAME | //UdpPacket.CMD_OPTION_STATE_PROFILE_PHOTO | //TODO 应该更新所有的,但是跨网的时候好像发送的byte太长,不能正常发送暂且去掉头像 UdpPacket.CMD_OPTION_STATE_PUBKEY | UdpPacket.CMD_OPTION_STATE_STATUS; packet.FromMAC = this.MAC; UdpPacketStateExtend extend = new UdpPacketStateExtend(); extend.PublicKey = _client.SecurityKeys.Public;//送公钥出去 extend.NickName = this.NickName; extend.ProfilePhoto = ProfilePhotoPool.GetPhoto(this.ID, false); extend.Status = this.Status; packet.Extend = extend; _client.Send(packet); Thread.Sleep(100); } //10分钟以后更新头像 WaitTimer.Start(1 * 60 * 10 * 1000, new TimerCallback((obj) => { UpdateState(LanIM.UpdateState.Photo); } ), null); }