Witam
Napisałem bardzo prosty skaner portów sieciowych, ale spotkałem pewne problemy z działaniem. Program wydaje się że działa poprawnie i faktycznie sprawdza, lecz każdy porty wykrywany przez niego jest zamknięty. Dla testu napisałem serwer i co ciekawe jedyny otwarty port wykrywany przez program to był ten do którego właśnie się podłączył (do serwera). W zasadzie jest to dość logiczne, ponieważ jak mam sprawdzić, czy port jest faktycznie otwarty, jeśli program nie ma się do czego podłączyć, stąd też nie jestem pewien, czy dobrze zrozumiałem poradniki i to co było w internecie.
I pytanie z innej beczki, chociaż dalej w temacie portów, otóż dlaczego, gdy stawiam serwer na adres INADDR_ANY
, a klient (w tym wypadku skaner) jest na tym samym komputerze, to klient nie może być zdefiniowany jako INADDR_ANY
, musi np. inet_addr( "127.0.0.1" )
(lub numer komputera z którym się łączy).
#include <iostream>
#include <string.h>
#include <winsock2.h >
using namespace std;
int ListenSocket;
int ConnectSocket;
int port;
struct sockaddr_in service;
int main()
{
SetConsoleTitleA( "PortScanner" );
WSADATA wsaData;
int result = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if( result != NO_ERROR )
{
fprintf( stderr, "WSAStartup failed\n" );
}
else fprintf( stderr, "WSAStartup success\n" );
for(port=0; port<100; port++)
{
memset( &service, 0, sizeof(service) );
service.sin_family=AF_INET;
service.sin_addr.s_addr=inet_addr( "127.0.0.1" );
service.sin_port=htons(port);
ConnectSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
int connecting = (connect(ConnectSocket, (sockaddr*)&service, sizeof(sockaddr)) == SOCKET_ERROR);
if (connecting)
{
printf("Port %d: CLOSE \n",port);
ConnectSocket = NULL;
}
else printf("Port %d: OPEN \n",port);
closesocket( ConnectSocket );
}
}
Pozdrawiam.