2013-05-20 3 views
0

IP 주소가 들어있는 파일로 모든 웹 서버를 찾는 프로그램이 필요합니다. 포트 80이 열려 있으면 IP 주소가 서버라는 것을 알았습니다. 그리고이 코드를 작성했지만 작동하지 않습니다. # 80 포트가 닫혀있다 심지어 opend 80 (예 : 194.153.145.104)와 IP 쓰기. 내가 틀린 곳? 나는 열려있는 포트와 여기에 IP의에 대한 cheking 해요 : http://www.yougetsignal.com/tools/open-ports/C/UNIX : 포트 스캐너

#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; 
    } 
+0

여기에 질문이 있습니까? 작동하지 않는 것은 무엇입니까? – FDinoff

+0

예. 프로그램은 포트 80이 열린 상태에서 포트 80이 닫히고 포트 80이 열린 경우에도 IP를 쓰는 것으로 항상 말합니다. (예 : 194.153.145.104) – cattaneo

답변

1

는 경고와 함께 컴파일 활성화나요? gcc를 사용하여 inet_addr이 올바르게 선언되지 않았다는 -Wall을 추가했습니다. <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
  • 와 포트 80에서 리스너를 설정하여 컴파일을 포함한다 : sudo는 NC -l (80)
  • 실행 된 : .

    : /a.out

ip.txt 파일 ip.txt처럼 보이는

~/src/so$ cat ip.txt 
127.0.0.1 
[email protected]:~/src/so$ file ip.txt 
ip.txt: ASCII text 

이 컴퓨터에서는 NC가 다른 컴퓨터보다 느리게 닫히기 때문에 "웹 서버입니다"라는 두 줄이 표시됩니다. 실행 환경은 uname -a가있는 Ubuntu LTS 12.04입니다. 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()를 호출하거나 다른 방법을 사용하여 오류를 파악합니다.

+0

출력 내용 : 127.0.0.1은 웹 서버가 아닙니다 127.0.0.1은 아닙니다. 웹 서버' – cattaneo