【问题标题】:Socket Programming PF Packet SocketSocket 编程 PF 数据包 Socket
【发布时间】:2012-11-11 11:38:11
【问题描述】:

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

【问题讨论】:

  • 我很困惑,你为什么不能只做socket_address.sll_addr[0] = ptr[0];等?
  • 你可能是对的。在发布我的答案时,我以某种方式忽略了提到 6 字节字符数组的 OP,但默默地假设源是一个字符串(这将是 17+1 个字节)。 @Wutz

标签: c linux sockets unix hex


【解决方案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 位值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2017-01-29
    • 2017-04-27
    • 2012-06-23
    相关资源
    最近更新 更多