C ++中的端口扫描程序挂起

时间:2012-06-02 09:51:24

标签: c port port-scanning

我在Linux中制作了一个简单的C端口扫描程序。主要算法是尝试调用connect,如果它返回-1,我无法连接,否则我连接主机。这在我的计算机上工作正常,它列出了我的开放端口。但是,在我的家里有另一台计算机(与我的同一路由器后面),我给它的IP但程序挂起。我试过google.com,facebook.com或任何其他网站,他们甚至没有回复第一个请求。我究竟做错了什么?

修改

for(port=0; port<=65536; port++)  
{  
    struct sockaddr_in addr;        
    addr.sin_family = AF_INET;  
    addr.sin_port = htons(port);  
    addr.sin_addr = *((struct in_addr *)he->h_addr);  
    memset(&(addr.sin_zero), '\0', 8);  
    if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) {
        printf("%i closed\n", port);  
        close(sockfd);  
    }  
    else {  
        printf("%i open\n", port);  
        close(sockfd);  
    }  
} 

1 个答案:

答案 0 :(得分:2)

默认情况下,connect会在返回错误之前阻止一段时间。您可以通过将套接字设置为非阻塞模式然后在超时时调用connect select来选择更短的超时。

有很多例子。关于nonblocking套接字的本教程非常清楚。或者参见OsNetworkConnect我之前写的一个例子。

您可能会故意阻止尝试连接外部站点上的任意端口(由系统管理员阻止端口扫描程序!)。

另请注意,您的循环条件略有不足。您应该在端口65535处终止.65536不能用16位表示。