Форум: "Сети";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизКак узнать свой ай-пишник? Найти похожие ветки
← →
Alexey Romanskiy (2004-12-23 20:26) [0]Как можно узнать ай-пишник компа, на котором запущена прога?
← →
Anatoly Podgoretsky © (2004-12-23 21:04) [1]127.0.0.1
← →
Eraser © (2004-12-23 21:45) [2]или
код компонента:
unit alxUSock;
interface
uses Windows, Winsock;
{
Åñëè Âû ïîìåñòèòå ñòðîêó ðåçóëüòàòîâ â wide TMEMO (â åãî ñâîéñòâî memo.lines.text)
òî íèêàêèõ ðåçóëüòàòîâ íå óâèäèòå.
Òåñòèðîâàëîñü íà Win98/ME/2K, 95 OSR 2 è NT service
pack #3 , ïîòîìó ÷òî èñïîëüçóåòñÿ WinSock 2 (WS2_32.DLL)
}
function EnumInterfaces(var sInt: string): Boolean;
{ ôóíêöèÿ WSAIOCtl èìïîðòèðóåòñÿ èç Winsock 2.0 - Winsock 2 äîñòóïåí }
{ òîëüêî â Win98/ME/2K è 95 OSR2, NT srv pack #3 }
function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen:
DWORD;
lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
lpdwOutBytesReturned: LPDWORD;
lpOverLapped: POINTER;
lpOverLappedRoutine: POINTER): Integer; stdcall; external "WS2_32.DLL";
{ Êîíñòàíòû âçÿòûå èç çàãîëîâêà C ôàéëîâ }
const SIO_GET_INTERFACE_LIST = $4004747F;
IFF_UP = $00000001;
IFF_BROADCAST = $00000002;
IFF_LOOPBACK = $00000004;
IFF_POINTTOPOINT = $00000008;
IFF_MULTICAST = $00000010;
type sockaddr_gen = packed record
AddressIn: sockaddr_in;
filler: packed array[0..7] of char;
end;
type INTERFACE_INFO = packed record
iiFlags: u_long; // Ôëàãè èíòåðôåéñà
iiAddress: sockaddr_gen; // Àäðåñ èíòåðôåéñà
iiBroadcastAddress: sockaddr_gen; // Broadcast àäðåñ
iiNetmask: sockaddr_gen; // Ìàñêà ïîäñåòè
end;
implementation
{-------------------------------------------------------------------
1. Îòêðûâàåì WINSOCK
2. Ñîçäà¸ì ñîêåò
3. Âûçûâàåì WSAIOCtl äëÿ äîñòóïà ê ñåòåâûì èíòåðôåéñàì
4. Äëÿ êàæäîãî èíòåðôåéñà, ïîëó÷àåì IP, MASK, BROADCAST, ñòàòóñ
5. Ðàçäåëÿåì ñòðîêó ñèìâîëîì CRLF
6. Êîíåö :)
--------------------------------------------------------------------}
function EnumInterfaces(var sInt: string): Boolean;
var s: TSocket;
wsaD: WSADATA;
NumInterfaces: Integer;
BytesReturned, SetFlags: u_long;
pAddrInet: SOCKADDR_IN;
pAddrString: PCHAR;
PtrA: pointer;
Buffer: array[0..20] of INTERFACE_INFO;
i: Integer;
begin
result := true; // Èíèöèàëèçèðóåì ïåðåìåííóþ
sInt := "";
WSAStartup($0101, wsaD); // Çàïóñêàåì WinSock
// Çäåñü ìîæíî äàáàâèòü ðàçëè÷íûå îáðàáîò÷èêè îøèáêè :)
s := Socket(AF_INET, SOCK_STREAM, 0); // Îòêðûâàåì ñîêåò
if (s = INVALID_SOCKET) then exit;
try // Âûçûâàåì WSAIoCtl
PtrA := @bytesReturned;
if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil,
nil)
<> SOCKET_ERROR)
then
begin // Åñëè OK, òî îïðåäåëÿåì êîëè÷åñòâî ñóùåñòâóþùèõ èíòåðôåéñîâ
NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);
for i := 0 to NumInterfaces-1 do // Äëÿ êàæäîãî èíòåðôåéñà
begin
pAddrInet := Buffer[i].iiAddress.addressIn; // IP àäðåñ
pAddrString := inet_ntoa(pAddrInet.sin_addr);
sInt:=sInt+pAddrString;
if i=NumInterfaces-1 then
sInt := sInt
else
sInt := sInt + #13#10;
// CRLF ìåæäó êàæäûì èíòåðôåéñîì
end;
end;
except
end;
//
// Çàêðûâàåì ñîêåòû
//
CloseSocket(s);
WSACleanUp;
result := false;
end;
end.
← →
VMcL © (2004-12-23 21:56) [3]>>Alexey Romanskiy (23.12.04 20:26)
У компьютера нет IP-адреса. Оный есть только у сетевых интерфейсов.
← →
Eraser © (2004-12-23 22:00) [4]А я про что ;-)))
← →
Ozone © (2004-12-25 05:51) [5]Eraser © (23.12.04 21:45) [2]
Зачем так заморачиваться, если есть библиотека IPHLPAPI? (гке можно за один прогон цикла узнать всю инфу о всех сетевых интерфейсах)
← →
Piter © (2004-12-25 14:15) [6]На такие вопросы надо отсылать в FAQ и тему закрывать.
← →
able © (2004-12-25 16:43) [7]а мне не сложно:
function LocalIP: String;
type
TaPInAddr = Array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: Array[0..63] of Char;
I: Integer;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
Result := "";
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
I := 0;
while pPtr^[I] <> nil do
begin
Result := inet_ntoa(pptr^[I]^);
Inc(I);
end;
WSACleanup;
end;
← →
XProger © (2004-12-27 03:49) [8]able, тогда он будет брать последий IP в очереди сетевых интерфейсов :)
т.е. вот я сижу щас у меня 3 IP адреса
127.xxx.xxx.xxx - я его тож за IP считаю ;)
0 10.0.2.65
1 212.248.15.42
Твой код возьмёт последний из них, ибо цикл у тебя стоит там :)
← →
able © (2004-12-27 07:15) [9]XProger © (27.12.04 3:49) [8]
able, тогда он будет брать последий IP в очереди сетевых интерфейсов :)
т.е. вот я сижу щас у меня 3 IP адреса
127.xxx.xxx.xxx - я его тож за IP считаю ;)
0 10.0.2.65
1 212.248.15.42
Твой код возьмёт последний из них, ибо цикл у тебя стоит там :)
Я привел лишь пример.
← →
XProger © (2004-12-27 18:34) [10]Ну, это я так, для общего образования :)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c