질문: 소켓 프로그래밍에서 주소인식

cs010101의 이미지

안녕하세요. 질문이 있습니다.

unsigned char *ip_address="\xC0\xA8\x00\x02";

... 중략 ...

sock_buff = *skb;
... 중략 ...

if(sock_buff->ng.iph->saddr == *(unsigned int*)ip_address){
... 중략 ...

}
...

이렇게 있을 때,

unsigned char *ip_address="\xC0\xA8\x00\x02";

*(unsigned int*)ip_address
이것의 관계를 알고 싶습니다.

만약, *(unsigned int*)ip_address 대신에 직접 값을 입력한다면,
어떻게 입력해야 하나요?

감사합니다.

antaran의 이미지

*(unsigned int*)ip_address 의 의미는 sock_buff->ng.iph->saddr 가 ip v4에서 주소가 4byte이니, 그냥 assign하는 거네요. saddr이 어떤 type으로 선언되어 있는지는

귀차니즘으로 그냥 패스 -_-;; 주소가 192(0xC0).168(0xA8).0(0x00).2(0x02) 군요

값을 직접 입력하신다는 의미는, 정확히는 잘 모르겠으나, 예를 들어 입력 받은 ip addr을

넣어야 한다는 말씀이시라면, inet_addr()함수를 사용하셔서 리턴 값을 할당 하시면 될 듯 합니다.

ex)
in_addr_t addr= inet_addr("127.0.0.1") ;
if(addr == -1)
{
// error!
}
sock_buff->ng.iph->saddr= addr ;

Necromancer의 이미지

ip 어드레스의 본래 정체는 32비트 숫자입니다.

사람이 좀 보기 좋게 8비트씩 나눈 다음 각 8비트를 10진수로 환산한 값을 쓰고 그 사이를 점으로 찍어서 쓰는 특이한 표기법을 쓸 뿐이죠.

그리고 big-endian으로 해야 합니다. x86일 경우에 이걸 해주는게 htonl()이죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction