Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        //发送上线
        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);
        }