c - Socket编程PF包套接字

标签 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字节呢?

最佳答案

您可以使用 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/

相关文章:

c - GCC 不支持简单的整数常量表达式?

c - 从二叉搜索树中删除多个节点

c - 如何使用 lncurses 检测太空入侵者控制台游戏中的子弹击中

linux - 从单行中提取校验和

c - 我无法将 char 作为字符串访问

regex - 使用 sed 向后删除特定空格

JavaFX 警告 : System can't support ConditionalFeature. SCENE3D

c# - 偶发的 TCP 连接失败 (WSAEHOSTUNREACH)

.net - [...] Async和Begin [...]。net异步API之间的区别

java - 无法将数据输入到数据输出流