要使用C++發(fā)送自定義ICMP請(qǐng)求,您需要使用原始套接字(raw sockets)
#include<iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
#include <unistd.h>
const int ICMP_PACKET_SIZE = 64;
void createIcmpHeader(icmphdr &icmpHeader, int type, int code) {
icmpHeader.type = type;
icmpHeader.code = code;
icmpHeader.checksum = 0;
}
uint16_t calculateChecksum(icmphdr &icmpHeader) {
uint32_t sum = 0;
uint16_t *buf = (uint16_t *)&icmpHeader;
uint16_t size = sizeof(icmpHeader);
while (size > 1) {
sum += *(buf++);
size -= 2;
}
if (size) {
sum += *(uint8_t *)buf;
}
while (sum >> 16) {
sum = (sum & 0xffff) + (sum >> 16);
}
return (uint16_t)(~sum);
}
int main() {
int rawSocket;
struct sockaddr_in targetAddress;
char datagram[ICMP_PACKET_SIZE];
// 創(chuàng)建原始套接字
if ((rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1) {
std::cerr << "Failed to create raw socket"<< std::endl;
return 1;
}
// 設(shè)置目標(biāo)地址
targetAddress.sin_family = AF_INET;
targetAddress.sin_addr.s_addr = inet_addr("8.8.8.8"); // 更改為您想要發(fā)送ICMP請(qǐng)求的IP地址
// 創(chuàng)建ICMP頭部
icmphdr *icmpHeader = (icmphdr *)datagram;
createIcmpHeader(*icmpHeader, ICMP_ECHO, 0);
// 計(jì)算校驗(yàn)和
icmpHeader->checksum = calculateChecksum(*icmpHeader);
// 發(fā)送ICMP請(qǐng)求
if (sendto(rawSocket, datagram, ICMP_PACKET_SIZE, 0, (struct sockaddr *)&targetAddress, sizeof(targetAddress)) <= 0) {
std::cerr << "Failed to send ICMP request"<< std::endl;
return 1;
}
std::cout << "ICMP request sent successfully!"<< std::endl;
close(rawSocket);
return 0;
}
這個(gè)示例代碼創(chuàng)建了一個(gè)原始套接字,然后構(gòu)建并發(fā)送一個(gè)ICMP回顯請(qǐng)求(ping請(qǐng)求)。請(qǐng)注意,運(yùn)行此代碼可能需要root權(quán)限。在運(yùn)行之前,請(qǐng)確保將目標(biāo)IP地址更改為您想要發(fā)送ICMP請(qǐng)求的IP地址。
在Linux上編譯和運(yùn)行此代碼:
g++ -o icmp_request icmp_request.cpp
sudo ./icmp_request
此代碼僅作為示例,實(shí)際應(yīng)用中可能需要根據(jù)需求進(jìn)行修改。