C++ 在网络中扫描开放端口的最快方法
如何在网络中扫描给定的端口号(如8000) 我尝试使用通用套接字tcp连接。虽然有效,但如果活动ip的数量超过15,则需要花费大量时间。目标是从给定端口打开的网络中获取ip列表。C++ 在网络中扫描开放端口的最快方法,c++,network-programming,port-scanning,C++,Network Programming,Port Scanning,如何在网络中扫描给定的端口号(如8000) 我尝试使用通用套接字tcp连接。虽然有效,但如果活动ip的数量超过15,则需要花费大量时间。目标是从给定端口打开的网络中获取ip列表。 这就是我如何从网络中获取IP列表的方法 std::vector<std::string> resultIPList; FILE* pipe = popen("arp-scan --localnet","r"); if(!pipe) { fprintf(stde
这就是我如何从网络中获取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);
你用错程序了。只需读取netstat的输出。使用nmap
或者在循环中,使用非阻塞套接字调用“连接”到每个端口。保存您收集的所有文件描述符,使用“select()”检查它们是否连接 你能发布一些代码来显示减速似乎发生在哪里吗?既然
SOCK\u STREAM
不支持多播(显然),除了逐个尝试所有已知的IP地址之外,你认为最快的方法是什么?除了尝试连接并查看它是否有效之外,几乎没有其他方法可以做。加速这类事情的一般方法是生成一组线程,让每个线程都尝试连接。不幸的是,对于TCP重试机制,没有好的方法来加速每个单独的尝试,这就是为什么要并行运行一组。你不能像那样使用netstat。@Rafaelbatista你当然可以像那样使用netstat。我继承了一个已经生产了几年的系统,它正是这样做的。显然,您必须更改参数和解析。此外,它直接提供端口,无需第二步。
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);