Итак, задача нам нужно перебрать все порты. Смотрим код:
#include "stdafx.h" #include "iostream.h" #include "fstream.h" #include "winsock2.h" #include "iostream.h" #pragma comment(lib,"wsock32.lib") void ErrorInfo(); void main() { ofstream ofs; ofs.open("log.txt"); WSADATA wsaData; if (WSAStartup(WINSOCK_VERSION, &wsaData)) { printf ("winsock not be initialized !\n"); } else { u_short ushTestPort; for (ushTestPort=2828;ushTestPort< 65535;ushTestPort++) { cout << ushTestPort << endl; SOCKET sock; sock = socket(AF_INET,SOCK_STREAM,0); if (sock!=INVALID_SOCKET) { SOCKADDR_IN socketaddr; socketaddr.sin_family = AF_INET; socketaddr.sin_addr.s_addr = inet_addr("192.168.1.1"); socketaddr.sin_port = htons(ushTestPort); int size=sizeof(socketaddr); sock=connect(sock,(LPSOCKADDR)&socketaddr,size); if (sock != SOCKET_ERROR ) { cout << "Port " <<ushTestPort << endl; ofs <<"Port " << ushTestPort << endl; } else ErrorInfo(); closesocket(sock); } else cout << "error create socket" << endl; } } WSACleanup(); ofs.close(); } void ErrorInfo() { int i=WSAGetLastError(); int g; switch (i) { case WSANOTINITIALISED: cout << "Not start WinSock" << endl; break; case WSAENETDOWN: cout << "NetWork failed" << endl; break; case WSAEADDRINUSE: cout << "Socket in use " << endl; break; case WSAEINTR: cout << "call WSACancelBlockingCall" << endl; break; case WSAEADDRNOTAVAIL: cout << "address not valid " << endl; break; case WSAETIMEDOUT: cout << "connection Time Out " << endl; break; case WSAENOTSOCK: cout << "Not Socket " << endl; break; case WSAECONNREFUSED: cout << "reject connection" << endl; break; default: cout << " ????? " << g << endl; cin >> g; break; } }
Итак, все самое необходимое в цикле:
for (ushTestPort=2828;ushTestPort< 65535;ushTestPort++) { }
Создаем сокет, указываем ему IP адрес и порт и связываем наш сокет с удаленным функцией connect(). Дальше может быть две ситуации. Установлено соединение или нет. Если просто нет такого порта, то ошибка будет.
case WSAECONNREFUSED: cout << "reject connection" << endl; break;
Именно такая ошибка. Все остальные связаны с другими причинами, а эта с отсутствием порта. Их много причин. Я не все обрабатываю. Посмотрите на default обработки ошибки:
default: cout << " ????? " << g << endl; cin >> g;
Ошибка неизвестна и я специально останавливаю программу, чтобы можно было начать с этого места. Конечно можно было сделать все лучше, только зачем ??? Это учебная программа и пожалуйста не пользуйтесь ею в хакерских целях. А лучше покажите начальству и пусть денег выделяют на защиту информации. Для этого пожалуйста. А защита сама напрашивается. Если зафиксирован перебор портов и хоть два порта перебрали, да еще за короткий промежуток времени - отрубать надо все и лучше сразу сервер от питания :-)))