我正在開發聊天室應用程序 - 使用TServerSocket和TClientSocket發送和接收文本 我可以從爲我發送的計算機獲取Socket.SocketHandle,但如何獲取該計算機的本地IP(或Computernetname)。如何通過SocketHandle獲取本地IP?
回答
TCustomWinSocket具有RemoteAddress
和RemoteHost
屬性分別獲取對等的IP和主機名值。您不需要使用SocketHandle
屬性,除非您想直接調用Winsock API函數,如getpeername()
和getnameinfo()
。
太棒了!非常感謝! 我只有15歲,很想用Delphi創建一些應用程序。 我想我可以學習很多東西,謝謝! – 2013-05-03 00:26:37
我已經成功使用了這段代碼很多年了。您必須在您的uses
列表中包含WinSock
。我有兩個全局變量:
var
FWSAData: TWSAData;
FWSAStarted: Integer;
我用下面的代碼初始化WSA
一次,以避免每次調用一個Winsock方法做它的開銷。
initialization
FWSAStarted := WSAStartup(MakeLong(1, 1), FWSAData);
finalization
if FWSAStarted = 0 then
WSACleanup;
用戶可以有多個本地IP地址。下面的代碼演示瞭如何獲取的計算機名(獲取IP地址),以及如何獲得的所有IP地址,通過使用Winsock API調用分號分隔:
function _GetComputerName : string;
var
len: DWORD;
begin
len := MAX_COMPUTERNAME_LENGTH + 1;
SetLength (result, len);
if not Windows.GetComputerName(PChar(result), len) then
RaiseLastOSError;
SetLength(result, len);
end;
function GetIPAddress: AnsiString;
var
Host: AnsiString;
IPs, i: Integer;
HostEnt: PHostEnt;
b1, b2, b3, b4: Byte;
begin
if FWSAStarted <> 0 then
raise Exception.Create('Unable to hook WINSOCK. "GetIPAddress" failed.');
Result := '';
Host := AnsiString(_GetComputerName);
HostEnt := GetHostByName(PAnsiChar(Host));
if Assigned(HostEnt) then
with HostEnt^ do
begin
// the ip addresses occupy 4 bytes per address in sequence from the beginning
// of the string, followed by the host name
IPs := (Length(h_addr^) - Length(Host)) div 4;
for i := 0 to IPs-1 do
begin
b1 := Byte(h_addr^[0+(4*i)]);
b2 := Byte(h_addr^[1+(4*i)]);
b3 := Byte(h_addr^[2+(4*i)]);
b4 := Byte(h_addr^[3+(4*i)]);
Result := Result + AnsiStrings.Format(';%u.%u.%u.%u', [b1, b2, b3, b4]);
end;
System.Delete(Result, 1, 1); // delete the first semicolon
end;
end;
我可能誤解了你的問題。我以爲你想知道如何獲得你的應用程序運行的計算機的IP地址。看來您正在詢問如何獲取遠程計算機的本地地址。此代碼僅用於獲取運行應用程序的計算機的本地IP。如果您正在爲客戶端和服務器編寫應用程序,那麼您可以在客戶端應用程序中使用它... – 2013-05-02 21:25:05
謝謝,但我認爲它很長,只需使用RemoteAddress – 2013-05-03 00:35:04
@JamesL .:使用'gethostbyname()'來檢索本地IP並不是100%可靠的,因爲它在某些配置中有一些隱藏的陷阱。您確實應該使用'GetAdaptersInfo()'或'GetAdaptersAddresses()',它們專門用於檢索本地適配器信息(包括IP)。更不用說'gethostbyname()'只支持IPv4,但'GetAdaptersAddresses()'同時支持IPv4和IPv6。 – 2013-05-03 03:19:39
- 1. 從SocketHandle獲取IP和端口
- 2. 如何獲取本地IP?
- 3. 如何通過DHCP可靠地獲取IP地址?
- 4. 如何通過modbus通訊獲取IP地址?
- 5. 通過IP地址獲取本地主機網頁
- 6. 通過IP獲取國家/地區
- 7. 獲取本地IP地址
- 8. 如何使用NativeScript獲取本地IP
- 9. 如何通過黑莓的www.ipaddresslocation.org獲取IP地址
- 10. 如何在JAVA中通過IP地址獲取時區
- 11. 如何獲取IP地址?
- 12. 如何獲取IP地址?
- 13. Ruby:獲取本地IP(nix)
- 14. Android 4.0.3獲取本地IP
- 15. 如何通過IP地址知道IP版本
- 16. 獲取本地IP地址在Delphi
- 17. 獲取非本地IP地址Java
- 18. 使用Boost.Asio獲取本地IP地址
- 19. 如何通過java獲取計算機的MAC地址和IP地址列表?
- 20. 如何通過IP地址獲取國家/地區名稱和/或代碼?
- 21. Scrapy通過IP地址抓取本地網站
- 22. 您可以通過JavaScript獲取用戶本地局域網IP地址嗎?
- 23. 通過IP地址
- 24. 如何通過PowerShell腳本獲取本地用戶的組?
- 25. 如何使用php獲取本地ip地址?
- 26. 如何使用koaJS獲取本地域IP地址
- 27. 如何獲取WindowsStore Apps的本地網絡IP地址
- 28. 如何獲取所有本地IP地址?
- 29. 如何使用vb獲取本地ip地址?
- 30. 如何使用JavaScript獲取本地IP地址?
IPv4和/或IPv6? – mjn 2013-05-02 16:24:54
我以爲'ScktComp'已折舊並且不推薦? – 2013-05-02 16:38:24
@JerryDodge:已經過時了,現在已經有一段時間了。但OP沒有指定他使用的是哪個Delphi版本,所以我猜測他使用的是舊版本,其中這些組件尚未被棄用,特別是考慮到它們必須在現代Delphi版本中手動安裝以便繼續使用它們。 – 2013-05-03 03:17:30