2012-06-02 59 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位表示。