2013-05-20 132 views
0

我需要找到所有網絡服務器到包含IP地址的文件的程序。 如果他的端口80打開,我發現IP地址是服務器。我寫了這段代碼,但它不起作用。 Аlways說80端口是關閉的,即使我用開放端口80寫IP也是如此(例如194.153.145.104)。我錯在哪裏? 我cheking這裏IP與開放端口: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寫IP也是如此(例如194.153.145.104) – cattaneo

回答

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
  • 設置端口80上向監聽器:須藤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比我的其他電腦慢。執行環境是Ubuntu LTS 12.04 with 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()或使用其他方法來計算錯誤。

+0

我的輸出是: '127.0.0.1不是web服務器 127.0.0.1不是網絡服務器「 – cattaneo