Форум: "Сети";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
ВнизОпределение адреса машины с открытым портом... Найти похожие ветки
← →
Hecker (2002-03-28 17:42) [0]Как узнать на какой машине в сети открыт порт? Только необходимо это сделать по протоколу TCP!
← →
Digitman (2002-03-28 18:54) [1]Итеративно сканируй все IP-адреса в сети, пытаясь осуществить коннект к заданному порту для каждого потенциально доступного IP-адреса. Успешный коннект укажет тебе хост с активным портом, интересующим тебя.
← →
Hecker (2002-03-28 19:42) [2]Digitman, если не сложно объясни подробнее, если можно кинь код, буду очень благодарен!
← →
kalex77 (2002-03-29 08:59) [3]Сканер портов с использованием TPowersock:
procedure TForm1.bbConnectClick(Sender: TObject);
begin
Powersock1.Host := edHost.Text;
Powersock1.Port := StrToInt(edPort.Text);
try
Powersock1.Connect;
except
on ESockError do Memo1.Lines.Add("Connect failed!");
end;
end;
Переделай так чтобы сканировало циклически и отдельными потоками,
каждый поток сканирует свой диапазон адресов и пользуйся.
← →
Digitman (2002-03-29 13:03) [4]
procedure RaiseError(ErrorCode: Integer; FuncName: String);
begin
raise Exception.Create("API error encountered" +
#10"Function : " + FuncName + #10"ErroroCode : " + IntToStr(ErrorCode) +
#10"Description : " + SysErrorMessage(ErrorCode));
end;
//
function GetActiveIpByPort(const Port: Word; const SubNetAddr, SubNetMask: string): string;
const
DLLName = "ws2_32.dll";
FD_MAX_EVENTS = 8;
FD_CONNECT_BIT = 4;
type
TWSANetworkEvents = record
lNetworkEvents: LongInt;
iErrorCode: Array[0..FD_MAX_EVENTS-1] of Integer;
end;
var
Msg: TMsg;
hWinSock2: THandle;
hSocket: TSocket;
hEvent: THandle;
WSAData: TWSAData;
Addr: TSockAddrIn;
ErrCode: Integer;
netaddr, netmask, nexthost, lasthost: DWord;
WSACreateEvent: function: THandle stdcall;
WSACloseEvent: function(hEvent: THandle): Boolean stdcall;
WSAEventSelect: function(s: TSocket; hEventObject: THandle; lNetworkEvents: Integer): Integer stdcall;
WSAEnumNetworkEvents: function (const s: TSocket; const hEventObject: THandle; var NetEvents : TWSANetworkEvents): Integer; stdcall;
NetworkEvents: TWSANetworkEvents;
begin
hWinSock2 := LoadLibrary(DLLName);
if hWinSock2 > HINSTANCE_ERROR then begin
WSACreateEvent := GetProcAddress(hWinSock2, "WSACreateEvent");
WSACloseEvent := GetProcAddress(hWinSock2, "WSACloseEvent");
WSAEventSelect := GetProcAddress(hWinSock2, "WSAEventSelect");
WSAEnumNetworkEvents := GetProcAddress(hWinSock2, "WSAEnumNetworkEvents");
end else
RaiseError(GetLastError, "LoadLibrary");
try
ErrCode := WSAStartup($0101, WSAData);
if ErrCode <> 0 then
RaiseError(ErrCode, "WSAStartup");
try
netaddr := ntohl(inet_addr(PChar(SubNetAddr)));
if netaddr = INADDR_NONE then
raise Exception.Create("Wrong subnet address : " + SubNetAddr);
netmask := ntohl(inet_addr(PChar(SubNetMask)));
if netmask = INADDR_NONE then
raise Exception.Create("Wrong subnet mask : " + SubNetMask);
lasthost := not netmask;
if (netaddr and lasthost) <> 0 then
raise Exception.Create("Wrong subnet range :"#10"Addr = " + SubNetAddr + #10"Mask = " + SubNetMask);
with Addr do begin
sin_family := PF_INET;
sin_port := htons(Port);
end;
hSocket := INVALID_SOCKET;
hEvent := INVALID_HANDLE_VALUE;
try
for nexthost:= 1 to lasthost - 1 do begin
Addr.sin_addr.s_addr := htonl(netaddr or nexthost);
if hSocket = INVALID_SOCKET then begin
hSocket := Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if hSocket = INVALID_SOCKET then
RaiseError(WSAGetLastError, "socket")
else begin
if hEvent = INVALID_HANDLE_VALUE then
hEvent := WSACreateEvent;
WSAEventSelect(hSocket, hEvent, FD_CONNECT);
end;
end;
// тек. контр. IP-адрес = string(inet_ntoa(Addr.sin_addr));
if Connect(hSocket, Addr, SizeOf(Addr)) = SOCKET_ERROR then begin
ErrCode := WSAGetLastError;
if ErrCode <> WSAEWOULDBLOCK then
RaiseError(ErrCode, "connect");
while True do
case MsgWaitForMultipleObjects(1, hEvent, False, 5000, QS_ALLINPUT) of
WAIT_OBJECT_0:
begin
WSAEnumNetworkEvents(hSocket, hEvent, NetworkEvents);
ErrCode := NetworkEvents.iErrorCode[FD_CONNECT_BIT];
case ErrCode of
0:
begin
Result := string(inet_ntoa(Addr.sin_addr));
Exit;
end;
WSAEADDRNOTAVAIL, WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT:
Break;
else
RaiseError(ErrCode, "connect");
end;
end;
WAIT_OBJECT_0 + 1:
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
DispatchMessage(Msg);
WAIT_TIMEOUT:
begin
CloseSocket(hSocket);
hSocket := INVALID_SOCKET;
WSACloseEvent(hEvent);
hEvent := INVALID_HANDLE_VALUE;
Break;
end;
end;
end;
end;
Result := "";
finally
if hSocket = INVALID_SOCKET then
CloseSocket(hSocket);
if hEvent <> INVALID_HANDLE_VALUE then
WSACloseEvent(hEvent);
end;
finally
WSACleanup;
end;
finally
FreeLibrary(hWinSock2);
end;
end;
//пример вызова :
// ищем хост в домене mastak.ru c с активным http-сервисом
showmessage(GetActiveIpByPort(80, "217.106.234.0", "255.255.255.0"));
← →
Hecker (2002-03-30 05:58) [5]Огромное спасибо, надеюсь что разберусь!
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c