要解决这个问题,您可以尝试以下代码示例:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 4096
int main() {
int sockfd;
struct sockaddr_ll sa;
struct ifreq ifr;
char ifname[IFNAMSIZ];
char buffer[BUFFER_SIZE];
// 创建原始套接字
sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (sockfd == -1) {
perror("socket() error");
return -1;
}
// 设置网卡名称
strncpy(ifname, "eth0", IFNAMSIZ - 1);
ifr.ifr_name[0] = '\0';
strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) {
perror("ioctl() error");
return -1;
}
// 设置原始套接字地址
memset(&sa, 0, sizeof(struct sockaddr_ll));
sa.sll_family = AF_PACKET;
sa.sll_protocol = htons(ETH_P_ALL);
sa.sll_ifindex = ifr.ifr_ifindex;
if (bind(sockfd, (struct sockaddr*)&sa, sizeof(struct sockaddr_ll)) == -1) {
perror("bind() error");
return -1;
}
// 接收数据包
while (1) {
ssize_t num_bytes = recv(sockfd, buffer, BUFFER_SIZE, 0);
if (num_bytes == -1) {
perror("recv() error");
return -1;
} else if (num_bytes > 0) {
// 处理收到的数据包
printf("Received %zd bytes\n", num_bytes);
}
}
// 关闭套接字
close(sockfd);
return 0;
}
请确保将代码中的eth0
替换为您实际使用的网卡名称。这段代码创建了一个原始套接字,并通过bind()
函数将其与指定的网卡关联。然后,通过循环调用recv()
函数来接收数据包,并在收到数据包时进行处理。
请注意,要运行此代码,您需要具有适当的权限(通常是root权限)才能创建原始套接字。