2012-11-23 75 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位值。