如何指定多网卡机器中的其中一块网卡,又如何获取指定网卡的IP地址
程序中我使用IdTCPClient控件进行通信,想要实现,指定其中一块网卡,并用指定网卡走数据,网卡的IP地址是通过DHCP指定的.
[解决办法]
http://www.delphibbs.com/delphibbs/dispq.asp?lid=587474
[解决办法]
unit NSetU;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, IPEdit, WinSock, ScktComp, CheckLst;
const
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;
type
TIP_ADDRESS_STRING = record
IPstring: array [0..15] of Char;
end;
PIP_ADDRESS_STRING = ^TIP_ADDRESS_STRING;
TIP_MASK_STRING = TIP_ADDRESS_STRING;
PIP_MASK_STRING = ^TIP_MASK_STRING;
PIP_ADDR_STRING = ^TIP_ADDR_STRING;
TIP_ADDR_STRING = record
Next: PIP_ADDR_STRING;
IpAddress: TIP_ADDRESS_STRING; //IP地址字符串
IpMask: TIP_MASK_STRING; //子网掩码字符串
Context: DWORD; //Netword table entry
end;
PIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;
TIP_ADAPTER_INFO = packed record
Next: PIP_ADAPTER_INFO;
ComboIndex: DWORD;
AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 4-1] of Char;
Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 4-1] of Char;
AddressLength: UINT;
Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH-1] of BYTE;
Index: DWORD;
dwType: UINT;
DhcpEnabled: UINT;
CurrentIpAddress: PIP_ADDR_STRING;
IpAddressList: TIP_ADDR_STRING;
GatewayList: TIP_ADDR_STRING;
DhcpServer: TIP_ADDR_STRING ;
HaveWins: BOOL;
PrimaryWinsServer: TIP_ADDR_STRING;
SecondaryWinsServer: TIP_ADDR_STRING;
end;
type
TnsForm = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
ServerSocket1: TServerSocket;
ListBox1: TCheckListBox;
Label3: TLabel;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure InitAddr();
procedure SetInterface();
end;
var
nsForm: TnsForm;
function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
pOutBufLen: PDWORD): DWORD; stdcall;
external 'IPHLPAPI.DLL ' name 'GetAdaptersInfo ';
implementation
{$R *.DFM}
uses SEShare, rsUnit;
const
LANCARDSFILE = 'LANCARDS.DAT ';
procedure TnsForm.Button2Click(Sender: TObject);
begin
Close();
end;
procedure TnsForm.FormCreate(Sender: TObject);
var
netlist: TStringList;
i: integer;
idx: integer;
begin//
InitAddr();
if FileExists(LANCARDSFILE) then
begin
netlist := TStringList.Create();
netlist.LoadFromFile(LANCARDSFILE);
for i := 0 to netlist.Count-1 do
begin
idx := ListBox1.Items.IndexOf(netlist[i]);
if idx > = 0 then
ListBox1.Checked[idx] := True;
end;
netlist.Free();
end;
end;
procedure TnsForm.InitAddr();
var
pbuf: PIP_ADAPTER_INFO;
buflen: DWORD;
i: integer;
begin
buflen := 0;
if GetAdaptersInfo(pbuf, @bufLen) = ERROR_BUFFER_OVERFLOW then
begin
pbuf := AllocMem(buflen);
if GetAdaptersInfo(pbuf, @bufLen) = ERROR_SUCCESS then
while pbuf <> nil do
begin
ListBox1.Items.Add(pbuf.IpAddressList.IpAddress.IPstring + '/ '
+ pbuf.IpAddressList.IpMask.IPstring);
pbuf := pbuf.Next;
end;
FreeMem(pbuf);
end;
end;
procedure TnsForm.Button1Click(Sender: TObject);
var
netlist: TStringList;
i: integer;
begin
{ SaveRegStrValue(REGKEYFOLDER, 'LocalIP ', IPEdit1.IPString);
SaveRegStrValue(REGKEYFOLDER, 'LocalMask ', IPEdit2.IPString);}
netlist := TStringList.Create();
for i := 0 to ListBox1.Items.Count-1 do
if ListBox1.Checked[i] then
netlist.Add(ListBox1.Items[i]);
if netlist.Count > 0 then
netlist.SaveToFile(LANCARDSFILE)
else
DeleteFile(LANCARDSFILE);
netlist.Free();
Close();
end;
procedure TnsForm.Button3Click(Sender: TObject);
begin
DeleteRegValue(REGKEYFOLDER, 'LocalIP ');
DeleteRegValue(REGKEYFOLDER, 'LocalMask ');
Close();
end;
procedure TnsForm.SetInterface();
begin
Font.Name := facefont;
Caption := faces[0];
Label1.Caption := faces[1];
Button1.Caption := faces[3];
Button2.Caption := faces[4];
// Button3.Caption := faces[5];
Label3.Caption := faces[9];
end;
end.