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

时间:2014-01-21 11:55:28

标签: 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(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的向量。现在我将逐个扫描每一个给定的端口。下面的函数是针对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);

2 个答案:

答案 0 :(得分:0)

您使用的是错误的程序。只需阅读netstat的输出。

答案 1 :(得分:0)

使用nmap。

或者在循环中,使用非阻塞套接字调用“connect”到每个端口。保存您收集的所有文件描述符,使用“select()”确认它们是否已连接;