2012-11-23 38 views
0

我正在编写一个代码,通过SOCK_RAW套接字与另一台计算机上的进程进行通信。套接字编程PF数据包套接字

我知道另一台机器的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

我很困惑,为什么你不能''socket_address.sll_addr [0] = ptr [0];'etc? – Wutz

+0

你可能是对的。当发布我的答案时,我不知何故忽略了提及*** 6 ***字节字符数组的OP,但默默地认为源是一个字符串(这将是17 + 1字节)。 @Wutz – alk

回答

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位值。