我的客户端是用网络引导的。
客户端如何得到DHCP服务器的IP地址。我现在通过编程实现了得到客户端本地的IP地址。
在客户端由于是使用WINPE启动的,所以不能使用IPCONFIG来查看DHCP的地址。
而我也只想用自己编一个程序来获得DHCP服务器的地址。
谢谢!
客户端如何得到DHCP服务器的IP地址。我现在通过编程实现了得到客户端本地的IP地址。
在客户端由于是使用WINPE启动的,所以不能使用IPCONFIG来查看DHCP的地址。
而我也只想用自己编一个程序来获得DHCP服务器的地址。
谢谢!
67/68端口, 如果开放了就是DHCP Server.
http://spaces.msn.com/easternstone/blog/
然后看那个IP有68端口的回应即可
//Client Broadcast
01 //Opcode: Boot request(0x01)
01 //Hardware type: Ethernet(0x01)
06 //Hardware address length: 6bytes
00 //Hop count: 0bytes
A0 9E D4 75 //Transcation ID: 0xA09ED475
00 00 //Seconds elapsed: 0
00 00 //Broadcast flag: 0x00
00 00 00 00 //Client IP address: 0.0.0.0
00 00 00 00 //Your IP address: 0.0.0.0
00 00 00 00 //Next server IP address: 0.0.0.0
00 00 00 00 //Gateway IP address: 0.0.0.0
01 1C 29 C3 19 B6 00 00 00 00 00 00 00 00 00 00 //Client hardware address:00:0C:29:C3:19:B6
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
63 82 53 63 //Magic cookie: (OK)
35 01 03 //Option 53: DHCP Message Type = DHCP Request
3D 07 01 00 0C 29 C3 19 B6
32 04 C0 A8 00 14 //Option 50: Requested IP address = 192.168.0.20
0C 09 79 61 6E 5F 76 6D 5F 30 31 //Option 12: Host Name = "yan_vm_01"
51 0D 00 00 00 79 61 6E 5F 76 6D 5F 30 31 2E //Option 81: Client Fully Qualified Domain Name(13Bytes)
3C 08
4D 53 46 54 20 35 2E 30 //Option 60: Vendor class identifier = "MSFT 5.0"
37 0B 01 0F 03 06 2C 2E 2F 1F 21 F9 2B
FF //End option
-----------------------
//DHCP Server Reply
02 //Opcode: Boot reply(0x02)
01 //Hardware type: Ethernet(0x01)
06 //Hardware address length: 6bytes
00 //Hop count: 0 bytes
A0 9E D4 75 //Transaction ID: 0xA09ED475
00 00 //Seconds elapsed: 0
00 00 //Broadcast flag: 0x00
00 00 00 00 //Client IP address: 0.0.0.0
C0 A8 00 14 //Your IP address: 192.168.0.20
C0 A8 00 01 //Next server IP address: 192.168.0.1
C0 A8 00 01 //Gateway IP address: 192.168.0.1
01 1C 29 C3 19 B6 00 00 00 00 00 00 00 00 00 00 //Client hardware address:00:0C:29:C3:19:B6
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //Server hostname: not given
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //Boot filename: not given
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 //Magic cookie: (OK)
35 01 05 //Option 53: DHCP Message Type = DHCP_ACK
32 04 C0 A8 00 14 //Option 50: Requested IP address = 192.168.0.20
01 04 FF FF FF 00 //Option 1: Subnet Mask = 255.255.255.0
33 04 00 01 51 80 //Optioin 51: IP Address lease Time (4 Bytes)
0F 08 70 72 69 76 61 74 65 00 //Option 15: Domain Name = "private"
36 04 C0 A8 00 01 //Option 54: Server Identifies = 192.168.0.1
03 04 C0 A8 00 01 //Option 3: Router = 192.168.0.1
06 0C C0 A8 00 01 CA 65 AC 2E CA 65 AC 2F //Option 6: Domain Name Server
FF //End option
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //Padding
那我如何在客户端得到DHCP服务器的IP地址。
那我如何在客户端得到DHCP服务器的IP地址。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, WinSock,
IdUDPServer, IdSocketHandle;type
TForm1 = class(TForm)
Button1: TButton;
IdUDPServer1: TIdUDPServer;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
CBuf: array [0..319] of Byte = ( //这些数据是我监听我的路由器得到的
$01, $01, $06, $00, $A6, $25, $3C, $AD, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0C,
$29, $B4, $0B, $34, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $63, $82, $53, $63,
$35, $01, $03, $3D, $07, $01, $00, $0C, $29, $B4, $0B, $34, $32, $04, $C0,
$A8, $00, $11, $0C, $0F, $79, $61, $6E, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $65, $51, $13, $00, $00, $00, $63, $68, $69, $6E, $61,
$2D, $31, $34, $38, $66, $37, $34, $66, $61, $65, $2E, $3C, $08, $4D, $53,
$46, $54, $20, $35, $2E, $30, $37, $0B, $01, $0F, $03, $06, $2C, $2E, $2F,
$1F, $21, $F9, $2B, $FF);
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
addr: sockaddr_in;
err: Integer;
IdUDPClient1: TIdUDPClient;
begin
IdUDPClient1 := TIdUDPClient.Create(nil);
with IdUDPClient1 do
begin
Host := '255.255.255.255';
Port := 67;
BroadcastEnabled := True;
end;
begin
addr.sin_family := PF_INET;
addr.sin_port := htons(68);
addr.sin_addr.s_addr := INADDR_ANY;
err := WinSock.Bind (IdUDPClient1.Binding.Handle, addr, sizeof(addr));
if err <> 0 then
begin
err := WSAGetLastError;
if err <> WSAEWOULDBLOCK then
begin
ShowMessage(IntToStr(err));
Exit;
end;
end;
end;
IdUDPClient1.SendBuffer(CBuf, SizeOf(CBuf));
IdUDPClient1.Free;
IdUDPServer1.DefaultPort := 68;
IdUDPServer1.Active := True;
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
AData.Position := 0;
ShowMessage(ABinding.PeerIP); //这个IP就是DHCP服务器的IP
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Self.IdUDPServer1.Active := False;
end;end.
memo1 load a.txt
find DHCP SERVER: ...