0

SOCK_RAWソケットを介して別のコンピューターのプロセスと通信するためのコードを書いています。

他のマシンの IP アドレスを知っています。

一度に1バイトずつ値を埋める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;

しかし、他のマシンの16進数アドレスを持つ6バイトの文字配列がある場合、同じことを行う方法がわかりません。

を使用して ':' 形式で 16 進アドレスを出力できます

printf("%.2x",*ptr++ & 0xff);

ここptrで、文字配列への配列です。

sll_addrしかし、これらの値を使用してバイトを埋める方法は?

4

1 に答える 1

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()です。

これは、どの範囲で何を見つけるかをスキャナに伝えます。

  • x16 進表記を期待するように指示します
  • hh8 ビット値を指定します。
于 2012-11-23T11:21:22.430 に答える