0

Linuxで簡単なCポートスキャナープログラムを作成しました。主なアルゴリズムは、connectを呼び出してみて、-1が返された場合は接続できませんでした。それ以外の場合は、ホストを接続しました。これは私のコンピューターでは正常に機能し、開いているポートが一覧表示されます。しかし、私の家には別のコンピューターがあり(私のルーターと同じルーターの後ろにあります)、IPを指定しましたが、プログラムがハングします。google.com、facebook.com、またはその他のWebサイトを試しましたが、最初のリクエストにも応答しません。私は何が間違っているのですか?

編集:

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はエラーを返す前に一定期間ブロックします。ソケットを非ブロッキングモードに設定してからconnectを呼び出し、タイムアウトを使用して選択することで、より短いタイムアウトを選択できます

これにはたくさんの例があります。非ブロッキングソケットに関するこのチュートリアルは非常に明確です。または、以前に作成した例については、 OsNetworkConnectを参照してください。

外部サイトの任意のポートに接続しようとすると、意図的にブロックされる可能性があります(sys管理者がポートスキャナーを推奨しないためです)。

ループ条件がわずかに外れていることにも注意してください。ポート65535で終了する必要があります。65536は16ビットで表すことはできません。

于 2012-06-02T10:51:13.623 に答える