0

我在 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);  
    }  
} 
4

1 回答 1

2

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

这方面的例子很多。这个关于非阻塞套接字的教程非常清楚。或者查看OsNetworkConnect以获取我之前编写的示例。

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

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

于 2012-06-02T10:51:13.623 回答