2012-06-02 33 views
0

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

编辑:

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); 
    } 
} 
+0

恐怕不看代码几乎是不可能的。 –

+0

你有没有试过等待60秒?或者无论默认的超时值是什么? –

+0

另外,'端口<65536'。 –

回答

2

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

这里有很多例子。关于nonblocking套接字的这个教程很清楚。或者参见OsNetworkConnect以前我写的一个例子。

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

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