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); }
//发送上线 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); }