西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)Delphi → Delphi編程中怎么獲取電腦上網卡的Ip地址

Delphi編程中怎么獲取電腦上網卡的Ip地址

前往專題相關軟件相關文章發(fā)表評論 來源:西西整理時間:2012/8/20 17:07:46字體大。A-A+

作者:佚名點擊:105次評論:0次標簽: 網卡

通過注冊表獲取IP地址
想到Windows會把系統(tǒng)網卡相關信息存入注冊表,肯定可通過注冊表讀取具體ip信息。大致思路是找HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards ,由NetworkCards得分支表示各個網卡的信息通過ServiceName到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces 下找到對應的網卡配置詳細信息,通過對注冊表的read與write實現讀取或修改ip地址等信息。

通過解析批處理命令結果獲取

在cmd命令行輸入ipconfig可以顯示出當前電腦ip地址,可以考慮先執(zhí)執(zhí)行命令"Ipconfig /all >Ips.txt",然后解析Ips.txt文件得到本機的Ip信息,此方法較繁雜。

通過delphi控件獲取Ip

找到fastnet 下的 Tpowersock控件,利用 該控件localip屬性返回 本機(主要指局域網) ip地址 。 放一個控件在窗體上可得到本機IP,方便簡單。

通過WinSock函數獲取Ip

此方法在程序中常用,一般函數如下:

//多網卡 將IP地址寫入到列表,求本機IP的話返回IP列表中的第一個即可,該函數要引用 WinSock

function GetLocalIpList(var IpList:TStringList):Integer;

type

TaPInAddr = array[0..10] of PInAddr;

PaPInAddr = ^TaPInAddr;

var

HostName: array [0..MAX_PATH] of char;

NameLen: Integer;

WSData: TWSAData;

lpHostEnt: PHostEnt;

I: Integer;

pptr: PaPInAddr;

begin

Result := 0;

if WSAStartup(MakeWord(2,0), WSData) <> 0 then Exit;

try

NameLen := sizeof(HostName);

fillchar(HostName, NameLen, 0);

NameLen := GetHostName(HostName, NameLen);

if NameLen = SOCKET_ERROR then Exit;

lpHostEnt := GetHostByName(HostName);

if lpHostEnt = Nil then Exit;

I := 0;

pPtr := PaPInAddr(lpHostEnt^.h_addr_list);

IpList.Clear;

while pPtr^[I] <> nil do

begin

IpList.ADD( inet_ntoa(pptr^[I]^));

Inc(I);

end;

Result := IpList.Count;

finally

WSACleanup;

end;

end;

該函數用到的主要Winsock方法有:

(1)WSAStartup,即WSA(Windows SocKNDs Asynchronous,Windows異步套接字)的啟動命令。是Windows下的網絡編程接口軟件Winsock1 或 Winsock2 里面的一個命令(Ps:Winsock 是由Unix下的BSD Socket發(fā)展而來,是一個與網絡協(xié)議無關的編程接口)。為了在應用程序當中調用任何一個Winsock API函數,首先第一件事情就是必須通過WSAStartup函數完成對Winsock服務的初始化,因此需要調用WSAStartup函數。使用Socket的程序在使用Socket之前必須調用WSAStartup函數。該函數的第一個參數指明程序請求使用的Socket版本,其中高位字節(jié)指明副版本、低位字節(jié)指明主版本;操作系統(tǒng)利用第二個參數返回請求的Socket的版本信息。當一個應用程序調用WSAStartup函數時,操作系統(tǒng)根據請求的Socket版本來搜索相應的Socket庫,然后綁定找到的Socket庫到該應用程序中。以后應用程序就可以調用所請求的Socket庫中的其它Socket函數了。函數定義如下:

  int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );wVersionRequested

 、 wVersionRequested:一個WORD(雙字節(jié))型數值,指定了應用程序需要使用的Winsock規(guī)范的最高版本。高位字節(jié)指出副版本(修正)號,低位字節(jié)指明主版本號。

⑵lpWSAData 指向WSADATA數據結構的指針,用來接收Windows Sockets實現的細節(jié)。

本函數必須是應用程序或DLL調用的第一個Windows Sockets函數。它允許應用程序或DLL指明Windows Sockets API的版本號及獲得特定Windows Sockets實現的細節(jié)。應用程序或DLL只能在一次成功的WSAStartup()調用之后才能調用進一步的Windows Sockets API函數。

  為支持日后可能和Windows Sockets 1.1有功能上差異的Windows Sockets實現及應用程序,在WSAStartup()中規(guī)定了一個協(xié)議。WSAStartup()的調用方和Windows Sockets DLL互相通知對方它們可以支持的最高版本,并且互相確認對方的最高版本是可接受的。在WSAStartup()函數的入口,Windows Sockets DLL檢查了應用程序所需的版本。如果所需版本低于DLL支持的最高版本,則調用成功并且DLL在wHighVersion中返回它所支持的最高版本,在

  wVersion中返回它的高版本和wVersionRequested中的較小者。然后Windows Sockets DLL就會假設應用程序將使用wVersion.如果WSDATA結構中的wVersion域對調用方來說不可接收,它就應調用WSACleanup()函數并且要么去另一個Windows Sockets DLL中搜索,要么初始化失敗。

  本協(xié)議允許Windows Sockets DLL和Windows Sockets應用程序共同支持一定范圍的Windows Sockets版本。如果版本范圍有重疊,應用程序就可以成功地使用Windows Sockets DLL。下列的圖表給出了WSAStartup()在不同的應用程序和Windows Sockets DLL版本中是如何工作的:

  應用程序版本 DLL版本 wVersionRequested wVersion wHighVersion 最終結果

  1.1 1.1 1.1 1.1 1.1 use 1.1

  1.0 1.1 1.0 1.1 1.0 1.0 use 1.0

  1.0 1.0 1.1 1.0 1.0 1.1 use 1.0

  1.1 1.0 1.1 1.1 1.1 1.1 use 1.1

  1.1 1.0 1.1 1.0 1.0 失敗

  1.0 1.1 1.0 -- -- WSAVERNOTSUPPORTED

  1.0 1.1 1.0 1.1 1.1 1.1 1.1 use 1.1

  1.1 2.0 1.1 2.0 1.1 1.1 use 1.1

2.0 1.1 2.0 1.1 1.1 失敗

返回值:0 成功。否則返回下列的錯誤代碼之一。注意通常依靠應用程序調用WSAGetLastError()機制獲得的錯誤代碼是不能使用的,因為Windows Sockets DLL可能沒有建立"上一錯誤"信息儲存的客戶數據區(qū)域。

  關于Windows Sockets提供者的說明:

  每一個Windows Sockets應用程序必須在進行其它Windows Sockets API調用前進行WSAStartup()調用。這樣,本函數就可以用于初始化的目的。

  進一步的說明在WSACleanup()的說明中有討論。

錯誤代碼

  WSASYSNOTREADY 指出網絡通信依賴的網絡子系統(tǒng)還沒有準備好。

  WSAVERNOTSUPPORTED 所需的Windows Sockets API的版本未由特定的Windows Sockets實現提供。

WSAEINVAL 應用程序指出的Windows Sockets版本不被該DLL支持。

(2)WSACleanup函數

int WSACleanup (void);

應用程序在完成對請求的Socket庫的使用后,要調用WSACleanup函數來解除與Socket庫的綁定并且釋放Socket庫所占用的系統(tǒng)資源。

WSAStartup應該與WSACleanup成對使用,WSAStartup的功能是初始化Winsock DLL,WSACleanup是來解除與Socket庫的綁定并且釋放Socket庫所占用的系統(tǒng)資源。 在Windows下,Socket是以DLL的形式實現的。在DLL內部維持著一個計數器,只有第一次調用WSAStartup才真正裝載DLL,以后的 調用只是簡單的增加計數器,而WSACleanup函數的功能則剛好相反,每調用一次使計數器減1,當計數器減到0時,DLL就從內存中被卸載!因此,你 調用了多少次WSAStartup,就應相應的調用多少次的WSACleanup.

(3)gethostname()

  【函數原型】

int PASCAL FAR gethostname (char FAR * name, int namelen);

  【使用說明】

  該函數可以獲取本地主機的主機名,其中:

  name:用于指向所獲取的主機名的緩沖區(qū)的指針。

  Namelen:緩沖區(qū)的大小,以字節(jié)為單位。

返回值:若無錯誤,返回0;否則,返回錯誤代嗎。

(4)gethostbyname()

  【函數原型】

struct hostent FAR * PASCAL FAR gethostbyname(const char FAR * name);

  【使用說明】

  該函數可以從主機名數據庫中得到對應的"主機"。

  該函數唯一的參數name就是前面調用函數gethostname()得到的主機名。若無錯誤,剛返回一個指向hostent結構的指針,它可以標識一個"主機"列表。

    wifi軟件
    (25)wifi軟件
    雖然現在很多互聯網廠商都發(fā)布了旗下的無線硬件產品,不過對于擁有內置無線網卡的用戶來說我們完全可以通過下載一些軟件來共享網絡,F在獵豹小米等都開發(fā)了隨身,如果不想花錢買這些產品,這里西西給大家整理了一些免費的共享軟件下載,希望對大家有幫助。免費免費集成于安全衛(wèi)士中,在主界面的功能大全中點擊更多就能找到,新安裝用戶需要在未添加服務中找到免費圖標,并點擊完成初始化安裝,或直接在搜索框中輸入也能找到該工具...更多>>
    免費wifi
    (70)免費wifi
    免費只得是可以免費使用的手機軟件,安全衛(wèi)士免費共享精靈獵豹免費等軟件均能輕松實現。在日常生活中,我們用到手機免費軟件的時候非常多,無論是在工作環(huán)境還是家庭生活中都離不開免費,西西為您推薦最好用的手機免費軟件免費軟件哪個好除了獵豹免費存在不少的兼容性問題外,安全衛(wèi)士和共享精靈的表現令人滿意。不過對于絕大多數用戶來說,集成于安全衛(wèi)士中的免費,其操作更簡單方便,適合實不同年齡段的用戶使用。...更多>>
    360wifi
    (20)360wifi
    西西專區(qū)為您提供所有相關客戶端下載,包含隨身各版本所有驅動和免費是什么只是一個模式,就是插在你聯網的電腦上,擴散信號,你手機可以搜到并且免費上網無線有哪些免費手機版免費電腦版隨身驅動電腦版隨身手機版連我獨立版隨身版驅動...更多>>
    wifi熱點
    (40)wifi熱點
    西西軟件園提供大量免費的熱點軟件,現在很多廠商都發(fā)布了隨身,可以給筆記本設置熱點,然后供手機等電子設備無線上網,看電視劇電影啥的不用擔心卡頓,再也不用擔心流量超標或不夠用啦,F在獵豹小米等都開發(fā)了隨身,如果不想花錢買這些產品,那么以下的電腦熱點軟件就很適合大家啦...更多>>
    獵豹免費wifi
    (13)獵豹免費wifi
    獵豹免費不用購買任何硬件。綠色純凈無需安裝,下載運行后電腦瞬間變無線路由器。從此手機免費上網,從此盡享無線快樂,,獵豹免費有哪些版本獵豹免費官網目前發(fā)布了獵豹免費原版獵豹免費校園神器版和獵豹免費萬能驅動版本,后續(xù)相信還會有更多版本誕生哦獵豹免費官網地址......,,手機平板電腦筆記本如何連接上網,即無線局域網,無線設備通過基站通常稱為熱點或無線互相連接,構成一個內部局域網。我們想用手機連接免費上網,開啟的...更多>>

    相關評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數: 0/500 (您的評論需要經過審核才能顯示)