原始套接字(Raw Socket)是一种允许应用程序直接与网络协议栈交互的套接字类型。通过原始套接字,开发者可以发送和接收原始的网络数据包,包括IP头和协议头(如ICMP、TCP、UDP等)。ICMP(Internet Control Message Protocol)是一种用于在IP主机和路由器之间传递控制消息的协议,常用于网络诊断和错误报告。
原始套接字主要有两种类型:
以下是一个简单的C语言示例,展示如何使用原始套接字接收ICMP请求:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#define BUF_SIZE 1500
int main() {
int raw_sock;
struct sockaddr_in my_addr;
char buffer[BUF_SIZE];
struct ip *ip_header;
struct icmp *icmp_header;
int header_len;
// 创建原始套接字
if ((raw_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
perror("socket");
exit(1);
}
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(0);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
while (1) {
int n = recvfrom(raw_sock, buffer, BUF_SIZE, 0, NULL, NULL);
if (n < 0) {
perror("recvfrom");
continue;
}
ip_header = (struct ip *)buffer;
header_len = ip_header->ip_hl << 2;
icmp_header = (struct icmp *)(buffer + header_len);
if (icmp_header->icmp_type == ICMP_ECHO) {
printf("Received ICMP Echo Request\n");
// 处理ICMP Echo Request
}
}
close(raw_sock);
return 0;
}
sudo
运行程序。通过以上步骤和示例代码,你应该能够在C语言中使用原始套接字接收ICMP请求。
领取专属 10元无门槛券
手把手带您无忧上云