コード例 #1
0
ファイル: DhcpClient.cs プロジェクト: tommybiteme/X
        /// <summary>拒绝</summary>
        /// <param name="dhcp"></param>
        /// <param name="state"></param>
        protected virtual void OnNak(DhcpEntity dhcp, Object state)
        {
            WriteLog("被拒绝 {0} 来自 {1}", Address, state);

            // 查找拒绝原因
            var opt = dhcp.Get(DhcpOptions.Message);
            if (opt != null)
            {
                WriteLog("拒绝原因:{0}", opt.ToStr());
            }
        }
コード例 #2
0
ファイル: DhcpClient.cs プロジェクト: tommybiteme/X
        void Client_Received(object sender, ReceivedEventArgs e)
        {
            var dhcp = new DhcpEntity();
            dhcp.Read(e.Stream, null);

            var kind = dhcp.Kind;
            WriteLog("收到:{0}", dhcp);
            switch (kind)
            {
                case DhcpMessageType.Offer:
                    OnOffer(dhcp, e.UserState);
                    break;
                case DhcpMessageType.Ack:
                    OnAck(dhcp, e.UserState);
                    break;
                case DhcpMessageType.Nak:
                    OnNak(dhcp, e.UserState);
                    break;
                default:
                    WriteLog("未知消息:\r\n{0}", dhcp);
                    break;
            }
        }
コード例 #3
0
ファイル: DhcpClient.cs プロジェクト: tommybiteme/X
        /// <summary>确认</summary>
        /// <param name="dhcp"></param>
        /// <param name="state"></param>
        protected virtual void OnAck(DhcpEntity dhcp, Object state)
        {
            WriteLog("已确认地址 {0} 来自 {1}", Address, state);

            // 查找租约时间
            var opt = dhcp.Get(DhcpOptions.IPLeaseTime);
            if (opt != null)
            {
                var buf = opt.Data.ReadBytes();
                buf.Reverse();
                var ts = new TimeSpan(0, 0, buf.ToInt());
                WriteLog("租约到期:{0}", ts);
            }
        }
コード例 #4
0
ファイル: DhcpClient.cs プロジェクト: tommybiteme/X
        /// <summary>发送请求</summary>
        public void SendRequest()
        {
            var dhcp = new DhcpEntity();
            dhcp.Kind = DhcpMessageType.Request;

            Send(dhcp);
        }
コード例 #5
0
ファイル: DhcpClient.cs プロジェクト: tommybiteme/X
        /// <summary>提供IP</summary>
        /// <param name="dhcp"></param>
        /// <param name="state"></param>
        protected virtual void OnOffer(DhcpEntity dhcp, Object state)
        {
            if (dhcp.TransactionID != TransID)
            {
                XTrace.Log.Error("响应消息事务不等于本地事务 0x{0:X8} != 0x{1:X8}", dhcp.TransactionID, TransID);
                return;
            }

            Address = new IPAddress(dhcp.YourIP);
            WriteLog("得到地址 {0} 来自 {1}", Address, state);
            foreach (var item in dhcp.Options)
            {
                WriteLog("{0,-16}: {1}", item.Option, item.ToStr());
            }

            // 发送确认
            SendRequest();
        }
コード例 #6
0
ファイル: DhcpClient.cs プロジェクト: tommybiteme/X
        /// <summary>广播发现</summary>
        public void SendDiscover()
        {
            var dhcp = new DhcpEntity();
            dhcp.Kind = DhcpMessageType.Discover;

            Send(dhcp);
        }
コード例 #7
0
ファイル: DhcpClient.cs プロジェクト: tommybiteme/X
        /// <summary>发送DHCP消息</summary>
        /// <param name="dhcp"></param>
        protected void Send(DhcpEntity dhcp)
        {
            dhcp.ClientMac = Mac;

            var opt = new DhcpOption();
            opt.SetClientId(Mac);
            dhcp.Options.Add(opt);

            if (Address != IPAddress.Any)
            {
                opt = new DhcpOption();
                opt.SetData(DhcpOptions.RequestedIP, Address.GetAddressBytes());
                dhcp.Options.Add(opt);
            }

            opt = new DhcpOption();
            opt.SetData(DhcpOptions.HostName, ("WSWL_SmartOS_").GetBytes());
            dhcp.Options.Add(opt);

            opt = new DhcpOption();
            opt.SetData(DhcpOptions.Vendor, "http://www.NewLifeX.com".GetBytes());
            dhcp.Options.Add(opt);

            opt = new DhcpOption();
            opt.SetData(DhcpOptions.ParameterList, new Byte[] { 0x01, 0x06, 0x03, 0x2b });
            dhcp.Options.Add(opt);

            dhcp.TransactionID = TransID;

            WriteLog("发送:{0}", dhcp);

            var buf = dhcp.ToArray();
            Client.Client.Broadcast(buf, 68);
        }