C++ 在网络中扫描开放端口的最快方法

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

如何在网络中扫描给定的端口号(如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);

你用错程序了。只需读取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);