- 編譯:代碼::塊(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));
1)結構必須打包,確保編譯器不對齊字段2)Windows是否支持原始套接字(我不知道這一點)? –