套接字编程PF数据包套接字

时间:2012-11-23 05:09:53

标签: c linux sockets unix hex

我正在编写一个代码,通过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个字节?

1 个答案:

答案 0 :(得分:1)

您可以使用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位值。