我正在编写代码,通过 SOCK_RAW
套接字与另一台计算机上的进程进行通信。
我知道对方机器的IP地址。
我知道一次填充一个字节的 sockaddr_ll.sll_addr
值将解决问题,例如
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;
但是当我有 6 个字节的字符数组和另一台机器的十六进制地址时,我不知道如何做同样的事情。
我可以使用
以 ':' 格式打印十六进制地址printf("%.2x",*ptr++ & 0xff);
其中 ptr
是字符数组的数组。
但是如何使用这些值来填充sll_addr
字节呢?
最佳答案
您可以使用 sscanf()
函数来执行此操作,如下所示:
#include <stdio.h>
#include <linux/if_packet.h>
const char sMac[] = "01:02:03:04:05:ff";
int main()
{
struct sockaddr_ll sa = {0};
sscanf(sMac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
&sa.sll_addr[0],
&sa.sll_addr[1],
&sa.sll_addr[2],
&sa.sll_addr[3],
&sa.sll_addr[4],
&sa.sll_addr[5]
);
return 0;
}
神奇的是传递给 sscanf()
的格式字符串。
它告诉扫描仪在哪里可以找到哪个范围内的内容。
x
告诉它期望十六进制表示法hh
指定 8 位值。
关于c - Socket编程PF包套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523428/