Esempio n. 1
0
        private void RetransPacket(UdpPacket packet)
        {
            if (packet.CheckSendResponse)
            {
                #region 需要回应收到包
                if (packet.Version == Packet.VERSION)
                {
                    UdpPacket packetRsp = new UdpPacket();
                    packetRsp.Address = packet.Address;
                    packetRsp.Port    = packet.Port;
                    packet.ToMAC      = packet.ToMAC;
                    packetRsp.FromMAC = this.MAC;
                    packetRsp.Command = UdpPacket.CMD_RESPONSE;

                    UdpPacketResponseExtend extendRsp = new UdpPacketResponseExtend();
                    extendRsp.ID     = packet.ID;
                    packetRsp.Extend = extendRsp;

                    _client.Send(packetRsp);
                }
                #endregion
            }

            UdpPacketRetransExtend extend = packet.Extend as UdpPacketRetransExtend;

            //修改目的地后转送
            UdpPacket retransPacket = new UdpPacket();
            retransPacket.Address = extend.Address;//传送目的地
            retransPacket.Port    = extend.Port;
            retransPacket.FromMAC = this.MAC;
            retransPacket.Command = UdpPacket.CMD_RETRANSMIT | UdpPacket.CMD_OPTION_NEED_RESPONSE;

            UdpPacketRetransExtend retransExtend = new UdpPacketRetransExtend(extend.PacketBuf);
            //更改来源地址
            retransExtend.PacketID = packet.ID;
            retransExtend.Address  = packet.Address;
            retransExtend.Port     = packet.Port;
            retransPacket.Extend   = extend;

            _client.Send(retransPacket);

            LoggerFactory.Debug("retrans:{0}", retransPacket);
        }
Esempio n. 2
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);
        }