2012-11-23 2 views
0

SOCK_RAW 소켓을 통해 다른 컴퓨터의 프로세스와 통신하는 코드를 작성하고 있습니다.소켓 프로그래밍 PF 패킷 소켓

다른 컴퓨터의 IP 주소를 알고 있습니다.

I 오전 시간에 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 바이트.

나는의 진수 주소를 인쇄 할 수 있어요 ':'ptr는 문자 배열 배열입니다

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

를 사용하는 형식입니다.

그러나이 값을 사용하여 sll_addr 바이트를 채우는 방법은 무엇입니까?

+1

나는 혼란 스럽다. 왜 당신은 단지'socket_address.sll_addr [0] = ptr [0];'etc? – Wutz

+0

아마도 맞을 것입니다. 내 대답을 게시 할 때 어떻게 든 OP 6 *** *** 바이트 문자 배열을 언급하는 OP 무시하지만 자동으로 문자열을 (17 + 1bytes 될) 원본 것으로 가정합니다. @ 와츠 – 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 비트 값을 지정하는 16 진수를 기대 알려줍니다.