2013-01-13 22 views
6
  • 編譯:代碼::塊(GNU GCC)
  • 平臺:視窗(86)
  • 包括:WINSOCK.H winsock2.h(WS2_32鏈接以及)

我目前正在嘗試編寫一個程序,它將讀取包含IP地址列表的文本文件,並分別ping每個IP地址。如果主機響應ping,則主機的IP地址將被複制到用戶指定的借調文件中。這是我第一次使用C的套接字庫,我無法找到一個關於如何使用C進行ping的好教程。從我所瞭解的我所瞭解的一對教程中,我找到了。我需要在IP數據報中包含一個ICMP頭,這是一個包含ICMP類型,代碼和校驗和的結構。但我不知道如何去做,我應該自己聲明結構還是在頭文件中聲明?我假設它在標題中,但教程相互矛盾,關於它在哪裏聲明。我厭倦了包括icmp.h和netinet/icmp.h但我的編譯器抱怨說他們不存在,所以我創建了自己的結構。如何Ping使用套接字庫 - Visual C

struct echo_request 
    { 
     char type; // Type 
     char code; // Code 
     short checksum; // Checksum 
     short id; // Identification 
     short seq; // Sequence 
     int time; // Time 
     char data[16]; // Data 
    }; 

我認爲我也許能逃脫它,而是因爲我的編譯器說in_cksum()(校驗和發電機)是不確定我是不是甚至能夠編譯我的程序。爲了總結我的問題,我應該包含哪些頭文件,如何創建ping數據包,使用正確的校驗和生成器函數,ping是否應該指向端口80,並且如果我使用的套接字是RAW還是DGRAM?

這就是我到目前爲止,請注意,我故意遺漏了錯誤檢查。

int socket_descriptor = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 

    struct sockaddr_in address; //Initialize address struct 
    memset(&address, 0, sizeof(address)); //Clear address struct 

    //Declare address 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = inet_addr(ipaddress); 
    address.sin_port = htons(80); 

    //Bind socket to address 
    bind(socket_descriptor, (struct sockaddr *)&address, sizeof(address)); 

    //Create packet 
    struct echo_request packet; //See above for declaration of struct 
    memset(packet.data, 1, 16); 
    packet.type = 8; //ECHO_REQUEST 
    packet.code = 0; 
    packet.time = gettime(); 
    packet.checksum = 0; 
    packet.checksum = in_cksum(packet, sizeof(packet)); 
+0

1)結構必須打包,確保編譯器不對齊字段2)Windows是否支持原始套接字(我不知道這一點)? –

回答

3

如果您不必從頭開始實施ping,並且您只需要Windows解決方案,那麼我會對Anton IcmpSendEcho的建議採用第二種方法。如果你必須實現ping,請看如何實現POCO ICMP包。它是可移植的代碼,它在Windows上運行良好。

在問候的具體問題,這裏有答案:

什麼頭文件,我應該包括

#include <winsock2.h> 

我怎麼創建一個ping包

有關IPv4 pa的示例,請參見ICMPv4PacketImpl::initPacket() cket。

我使用了正確的校驗和產生功能

不適用於Windows。有關校驗和功能的示例,請參閱ICMPPacketImpl::checksum()

應該一平被定向到端口80

號有作爲端口沒有這樣的事情,當談到ICMP。見Does ICMP use a specific port?

我應該用插座是RAW或DGRAM

它應該是RAW。

+0

謝謝您提供的信息豐富且有幫助的答案。 –

2

它看起來像你想要一個真正的解決方案,而不僅僅是爲了它而重新實現PING。

我建議(在預WinXP的系統ICMP.DLL)使用IP幫手,具體地,IcmpSendEcho(或其增強版本,IcmpSendEcho2IcmpSendEcho2Ex,異步操作)。

在MSDN上有一個「ping」主機的完整示例。這可能是一個很好的起點。

更新:對於GCC(mingw),鏈接到-liphlpapi。

+0

感謝您的回覆。我知道IcmpSendEcho,但我想實現一個相對便攜的解決方案。 –