Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-30751
esVer
2002-05-28 15:31
2002.06.10
Русский язык в нерусской Windows


1-30885
ETeRNaL
2002-05-30 06:05
2002.06.10
TRichEdit


6-30935
SNTP beginner
2002-03-27 17:34
2002.06.10
Simple Network Time Protocol


1-30739
Juriy
2002-05-28 16:12
2002.06.10
TActionList в runtime


3-30686
uncle_m16
2002-05-17 18:51
2002.06.10
триггер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский