示例#1
0
        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 static void EncodeRetransmitExtend(BinaryWriter wtr, object extendObj)
        {
            UdpPacketRetransExtend extend = extendObj as UdpPacketRetransExtend;

            wtr.Write(extend.PacketID);

            wtr.Write(extend.Address.ToString());
            wtr.Write(extend.Port);

            wtr.Write(extend.Length);
            wtr.Write(extend.PacketBuf);
        }
示例#3
0
        private static UdpPacketRetransExtend ResolveRetransmitExtend(BinaryReader rdr)
        {
            long pktId = rdr.ReadInt64();

            string strIp = rdr.ReadString();
            int    port  = rdr.ReadInt32();
            int    len   = rdr.ReadInt32();

            byte[] buf = rdr.ReadBytes(len);

            UdpPacketRetransExtend extend = new UdpPacketRetransExtend(buf);

            extend.PacketID = pktId;
            extend.Address  = IPAddress.Parse(strIp);
            extend.Port     = port;
            return(extend);
        }
示例#4
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);
        }