2016-07-07 6 views
1

UDP를 기반으로 리눅스 커널에 프로토콜을 구현 중이며 패킷을 받으면 커널 내에서 응답을 보내려고합니다. 이를 위해 ip4_datagram_connect을 실행하여 대상 (수신 된 패킷의 원본 주소)에 대한 경로를 얻은 다음 회신을 보내려고합니다.ip 헤더에서 struct sockaddr_in을 채우십시오. __be32 saddr 및 udp header __be16 source

ip4_datagram_connect으로 전화하려면 함수에 주소로 전달하기 위해 sockaddr_in 구조체를 채워야합니다.

구조체를 sockaddr_in, 비교에

unsigned short sin_port;   
struct in_addr sin_addr; 

구조체

__be16 source;

iphdr 구조체 udphdr

내 질문에, 주소 및 포트 (소켓 프로그래밍에서 htons 등 사용하는 방법을 sockaddr_in 구조로 패킷 헤더에서 복사하려면 도우미 함수가 필요합니까?)?

답변

1

원시 IP 및 UDP 헤더의 값은 이미 네트워크 바이트 순서입니다. 예 : be__be16은 네트워크 바이트 순서 인 "Big Endian"의 약자입니다. __be16__be32의 숫자는 비트 수입니다.

sockadd_in 구조의 필드도 네트워크 바이트 순서로 간주됩니다. htons이라는 이름은 "Host Short to Network Short"의 약자로 호스트 바이트 순서에서 네트워크 바이트 순서로 short (일반적으로 16 비트)을 변환합니다.

귀하의 질문에 대답하십시오 : 아니요, 아무 것도 할 필요가 없습니다. sin_portsin_addr.s_addr으로의 일반 할당으로 충분해야합니다.

+0

감사합니다. 시도해보고 여기를보고 싶습니다. –

+0

예상대로 작동 했습니까? –