0

IP アドレスを含むファイルにすべての Web サーバーを検索するプログラムが必要です。彼のポート80が開いている場合、IPアドレスはサーバーであることがわかりました。そして、私はこのコードを書きましたが、うまくいきません。ポート 80 は閉じていると言われていますが、ポート 80 を開いた状態で IP を書き込んでいます (たとえば、194.153.145.104)。どこが間違っていますか?ポートが開いている IP をここでチェックしています: http://www.yougetsignal.com/tools/open-ports/

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[])
{

u_short port=80;            /* user specified port number */
short int sock = -1;        /* the socket descriptor */
struct hostent *host_info;  /* host info structure */
struct sockaddr_in address; /* address structures */
char addr[1023];
char buf[20];
char *filename;

filename=argv[1];

FILE *file = fopen( filename, "r" );

    while (!feof(file))
    {
    fscanf(file,"%s",buf);
    strncpy(addr, buf, 1023);


    bzero((char *)&address, sizeof(address));
    address.sin_addr.s_addr = inet_addr(addr);
    address.sin_port = htons(port);      
    address.sin_family=AF_INET;

    sock = socket(PF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        fprintf(stderr, "Error: could not assign master socket\n");
        exit (1);
    }
    if(connect(sock,(struct sockaddr *)&address,sizeof(address)) == 0)
        printf("%s is a web server\n", addr);

    else printf("%s isn't a web server\n", addr);

    close(sock);

    }

    return 0;
    }
4

1 に答える 1

1

警告を有効にしてコンパイルしましたか? gcc を使用して -Wall を追加しましinet_addrた。インクルード<arpa/inet.h>すると、プログラムがうまく機能します。

考えられるエラーを検出して特定するために、使用するすべての関数とシステム コールの戻り値を確認することをお勧めします。

出力例:

$ ./a.out ip.txt 
127.0.0.1 is a web server
127.0.0.1 isn't a web server

編集:OPではまだ機能しないため、テストセットアップに関する詳細を追加します。

  • インクルードを追加<arpa/inet.h>
  • gcc -Wall -O0 http_port_scan.c でコンパイル
  • sudo nc -l 80を使用して、ポート 80 でリスナーをセットアップします。
  • 実行: ./a.out ip.txt

ファイル ip.txt は次のようになります。

~/src/so$ cat ip.txt 
127.0.0.1
thuovila@glx:~/src/so$ file ip.txt 
ip.txt: ASCII text

このコンピューターでは、nc が他のコンピューターよりも遅く閉じられるため、「is a web server」という 2 つの行が表示されます。実行環境は Ubuntu LTS 12.04 で uname -a: Linux glx 3.2.0-43-generic #68-Ubuntu SMP Wed May 15 03:33:33 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

私の提案は、関数のすべての戻り値のチェックを追加し、失敗した場合は perror() を呼び出すか、他の手段を使用してエラーを特定することです。

于 2013-05-20T14:14:54.697 に答える