2017-03-07 7 views
0

C++で単純なポートスキャナを構築したいと思います。ただし、ソケットのタイムアウトを1に設定すると、プログラムは次のポートをテストするよりもずっと時間がかかります。私は何か間違っているのですか?その名前があなたに提案する必要があるとしてsetsockoptはC++では動作しません(タイムアウトは1に設定され、それ以上待ちます)

#include <iostream> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <fstream> 
#include <unistd.h> 
#include <errno.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/time.h> 

int main() 
{ 
    int socketFileDescriptor; 
    struct sockaddr_in server_address; 

    for (int i=3000; i<65535; i++) 
    { 
     std::cout<<i<<std::endl; 

     socketFileDescriptor = socket(AF_INET,SOCK_STREAM, 0); 

     struct timeval tv; 
     tv.tv_sec = 1; 

     if (setsockopt(socketFileDescriptor, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) 
     { 
      perror("Error"); 
     } 

     server_address.sin_family = AF_INET; 
     server_address.sin_port = htons(i); 
     inet_pton(AF_INET,"212.182.24.27", &(server_address.sin_addr)); 

     int result = connect(socketFileDescriptor, 
          (struct sockaddr*)&server_address,sizeof(struct sockaddr)); 
     if (result != -1) 
     { 
      std::cout<<"Port: "<<i<<std::endl; 
     } 
     close(socketFileDescriptor); 
    } 
} 
+2

'timeval'構造体全体を初期化していないことがわかりました。 'tv_usec'の値をゼロにして再試行する必要があります。 'tv_sec'を設定する前に宣言時に構造体をゼロ初期化するか、明示的に各メンバを設定してください。 – paddy

答えて

3

SO_RCVTIMEOは、タイムアウトではなく、接続タイムアウトを受け取る設定します。

接続タイムアウトを取得するには、非ブロッキングモードとselect()を使用する必要があります。

関連する問題