以太网头中 src dst 字段的初始化问题
Problem in the initialization of src dst fields in the ethernet header
目标: 从零开始制作一个数据包并通过套接字发送它
问题: 目前我不确定以太网头结构是否具有正确的 mac 地址,因为打印显示的只是混乱的符号。是我使用了错误的格式说明符还是存在其他问题?
int main(){
const char IF[] = "wlp3s0"; // modify to change interface
int sockfd, ifindex;
struct ifreq ifr;
size_t if_name_len;
char buf[BUF_SIZE];
struct ether_header *eh = (struct ether_header *) buf;
struct iphdr *iph = (struct iphdr *) (buf + sizeof(struct ether_header));
// create raw socket to send/receive ethernet frames that transport ip packet
if ((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))) == -1) {
perror("socket");
}
// get interface name length
if_name_len = strlen(IF);
if(if_name_len < IF_NAMESIZE) {
strncpy(ifr.ifr_name, IF, strlen(IF));
}
// get the interface index number
if(ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1){
perror("ioctl");
}
ifindex = ifr.ifr_ifindex;
// build ethernet header
const char dmac[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
memcpy(eh->ether_dhost, dmac, ETHER_ADDR_LEN);
printf("%s\n", eh->ether_dhost);
printf
调用显示奇怪的符号,因为您使用了错误的格式说明符。没有正确的格式说明符来打印 MAC 地址。您可以使用 %02hhx
单独打印每个部分(即使用 6 次)。
你得到奇怪符号的原因是因为你告诉 printf
打印一个字符串。字符串是一系列字节,其中每个字节都是一个字符的 ASCII 代码,后跟一个 0 字节以指示字符串的结尾。 printf
将打印 ASCII 码 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,然后它会继续打印直到恰好找到一个 0 字节,可能还会打印更多字符。
目标: 从零开始制作一个数据包并通过套接字发送它
问题: 目前我不确定以太网头结构是否具有正确的 mac 地址,因为打印显示的只是混乱的符号。是我使用了错误的格式说明符还是存在其他问题?
int main(){
const char IF[] = "wlp3s0"; // modify to change interface
int sockfd, ifindex;
struct ifreq ifr;
size_t if_name_len;
char buf[BUF_SIZE];
struct ether_header *eh = (struct ether_header *) buf;
struct iphdr *iph = (struct iphdr *) (buf + sizeof(struct ether_header));
// create raw socket to send/receive ethernet frames that transport ip packet
if ((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))) == -1) {
perror("socket");
}
// get interface name length
if_name_len = strlen(IF);
if(if_name_len < IF_NAMESIZE) {
strncpy(ifr.ifr_name, IF, strlen(IF));
}
// get the interface index number
if(ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1){
perror("ioctl");
}
ifindex = ifr.ifr_ifindex;
// build ethernet header
const char dmac[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
memcpy(eh->ether_dhost, dmac, ETHER_ADDR_LEN);
printf("%s\n", eh->ether_dhost);
printf
调用显示奇怪的符号,因为您使用了错误的格式说明符。没有正确的格式说明符来打印 MAC 地址。您可以使用 %02hhx
单独打印每个部分(即使用 6 次)。
你得到奇怪符号的原因是因为你告诉 printf
打印一个字符串。字符串是一系列字节,其中每个字节都是一个字符的 ASCII 代码,后跟一个 0 字节以指示字符串的结尾。 printf
将打印 ASCII 码 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,然后它会继续打印直到恰好找到一个 0 字节,可能还会打印更多字符。