AF_PACKET是Linux系统中用于访问网络设备的套接字类型之一,而以太网是一种常见的局域网技术。下面是一个使用AF_PACKET套接字和以太网的代码示例:
#include
#include
#include
#include
#include
#include
#include
#include
int main() {
int sockfd;
struct sockaddr_ll sa;
struct ifreq ifr;
char ifname[IFNAMSIZ];
// 创建AF_PACKET套接字
sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (sockfd == -1) {
perror("socket");
exit(1);
}
// 设置网卡名称
strcpy(ifname, "eth0");
// 获取网卡接口索引
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) {
perror("ioctl");
close(sockfd);
exit(1);
}
// 设置套接字地址结构
memset(&sa, 0, sizeof(sa));
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(sa)) == -1) {
perror("bind");
close(sockfd);
exit(1);
}
// 接收和发送数据
while(1) {
char buffer[ETH_FRAME_LEN];
ssize_t numBytes = recv(sockfd, buffer, sizeof(buffer), 0);
if (numBytes == -1) {
perror("recv");
close(sockfd);
exit(1);
}
// 在这里处理接收到的以太网数据包
printf("Received %zd bytes\n", numBytes);
}
close(sockfd);
return 0;
}
上述示例代码创建了一个AF_PACKET套接字,绑定到指定的以太网接口("eth0")。然后它使用recv函数接收数据包,并在控制台输出接收到的字节数。你可以根据需要在代码中添加处理接收到的数据包的逻辑。