gpt4 book ai didi

c - 使用原始套接字时,为什么需要给出两次 MAC 地址?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:16 27 4
gpt4 key购买 nike

我想在 Linux 中使用 raw_socket 发送以太网帧,我使用下面的代码。它有效,但我不明白既然我已经在帧(缓冲区)中给出了 MAC 地址,为什么我必须在 struct sockaddr_ll 中再次给出它?

s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
/*socket_address*/
struct sockaddr_ll socket_address;
socket_address.sll_addr[0] = 0x00;
socket_address.sll_addr[1] = 0x04;
socket_address.sll_addr[2] = 0x75;
socket_address.sll_addr[3] = 0xC8;
socket_address.sll_addr[4] = 0x28;
socket_address.sll_addr[5] = 0xE5;
/*frame*/
unsigned char src_mac[6] = {0x00, 0x01, 0x02, 0xFA, 0x70, 0xAA};
unsigned char dest_mac[6] = {0x00, 0x04, 0x75, 0xC8, 0x28, 0xE5};
memcpy((void*)buffer, (void*)dest_mac, ETH_ALEN);
memcpy((void*)(buffer+ETH_ALEN), (void*)src_mac, ETH_ALEN);

send_result = sendto(s, buffer, ETH_FRAME_LEN, 0,
(struct sockaddr*)&socket_address, sizeof(socket_address));

最佳答案

如果你输入 man 2 sendto 你会得到以下信息:

 ssize_t
send(int socket, const void *buffer, size_t length, int flags);

ssize_t
sendmsg(int socket, const struct msghdr *buffer, int flags);

ssize_t
sendto(int socket, const void *buffer, size_t length, int flags,
const struct sockaddr *dest_addr, socklen_t dest_len);


也许你应该使用 sendsendmsg

关于c - 使用原始套接字时,为什么需要给出两次 MAC 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20611387/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com