2012-06-02 7 views
0

Я сделал простую программу C-сканера C в Linux. Основным алгоритмом является попытка вызова connect, если он возвращает -1, я не смог подключиться, иначе я подключил хост. Это отлично работает на моем компьютере, в нем перечислены мои открытые порты. Однако в моем доме есть еще один компьютер (за тем же маршрутизатором с моим), и я даю ему IP, но программа зависает. Я попробовал google.com, facebook.com или любой другой сайт, и они даже не отвечают на первый запрос. Что я делаю не так?Port Scanner в C++ Hangs

EDIT:

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 перекроют на период до возвращения ошибки. Вы можете выбрать более короткий тайм-аут, установив сокет в неблокирующий режим, затем вызовите connect, затем select с таймаутом.

Существует множество примеров этого. Этот урок на сокетах nonblocking довольно ясен. Или см. OsNetworkConnect для примера, который я написал ранее.

Ваши попытки подключения к произвольным портам на внешних сайтах могут быть преднамеренно заблокированы (администраторы sys обескураживают сканеры портов!).

Обратите также внимание на то, что условия вашей петли немного нарушены. Вы должны остановиться на порту 65535. 65536 не может быть представлено в 16 бит.