ネットワーク内の特定のポート番号 (8000) をスキャンするにはどうすればよいですか?
一般的なソケットTCP接続を使用して試しました。動作しますが、生きている IP の数が 15 を超えると、かなりの時間がかかります。目標は、特定のポートが開いているネットワークから IP のリストを取得することです。
これは、ネットワークからIPのリストを取得する方法です
std::vector<std::string> resultIPList;
FILE* pipe = popen("arp-scan --localnet","r");
if(!pipe)
{
fprintf(stderr,"Unable to open pipe");
return resultIPList;
}
char buffer[128];
while(!feof(pipe))
{
if(fgets(buffer, 128, pipe) != NULL)
{
stringBuffer += buffer;
}
}
pclose(pipe);
これで、stringBuffer に IP リストが追加されました。文字列から ip を抽出し、それらの ip のベクトルを提供するパーサーを作成しました。次に、特定のポートについてそれぞれを 1 つずつスキャンします。以下の関数は Windows 用です。Linux では、boost::asio を使用して同じことを行っています。
struct sockaddr_in client;
int sock;
client.sin_family = AF_INET;
client.sin_port = htons(portNo);
client.sin_addr.s_addr = inet_addr( Ip.c_str() );
sock = (int) socket(AF_INET, SOCK_STREAM, 0);
return (::connect(sock, (struct sockaddr *) &client,sizeof(client)) == 0);