로우소켓 사용시 소켓바인딩
아래 질문이 좀 이해안되신다하여 다시 올려봅니다;
리눅스에서 로우소켓을 사용하면
IP 헤더랑, TCP/UDP 헤더를 직접 작성 할 수 있잔아요?
// IP Header
typedef struct ip_hdr
{
unsigned char ip_header_len:4; // 4-bit header length (in 32-bit words) normally=5 (Means 20 Bytes may be 24 also)
unsigned char ip_version :4; // 4-bit IPv4 version
unsigned char ip_tos; // IP type of service
unsigned short ip_total_length; // Total length
unsigned short ip_id; // Unique identifier
unsigned char ip_frag_offset :5; // Fragment offset field
unsigned char ip_more_fragment :1;
unsigned char ip_dont_fragment :1;
unsigned char ip_reserved_zero :1;
unsigned char ip_frag_offset1; //fragment offset
unsigned char ip_ttl; // Time to live
unsigned char ip_protocol; // Protocol(TCP,UDP etc)
unsigned short ip_checksum; // IP checksum
unsigned int ip_srcaddr; // Source address
unsigned int ip_destaddr; // Source address
}IPV4_HDR;
이런식으로 헤더 구조체안에 IP 주소를 직접
채운다음 이 구조체의 포인터를 넘겨주는 식으로요
// send dns reply!!
int r = sendto(sd_send, frame, 20 + 8 + len, 0, &myaddr, sizeof(myaddr));
sd_send 가 로우소켓의 descriptor 라고 하고
frame 이라는것이 IP 또는 TCP 헤더의 시작을 나타내는 포인터라고 할때요 위와같이...
그런데 sendto 함수에서 5, 6 번째에 보시면
myaddr 이런게 있는데
이게 struct sockaddr_in 타입의 구조체입니다
이 속에도 아이피주소와 포트번호의 정보가 들어갑니다.
그러면 frame 이 가리키는 덤프 데이터 속에 들어있는 IP 주소랑 포트번호와
myaddr 구조체가 가지고있는 IP 주소랑 포트번호중에
로우소켓은 뭘 쓰는건가요?
둘다 일치하게 주니까 되긴되는데
좀 자세히 무슨일이 일어나는건지 커널레벨에서 알고싶네요 ㅠㅠ
packet(7) 매뉴얼 페이지에 보시면 addr는
packet(7) 매뉴얼 페이지에 보시면 addr는 sockadrr_ll (아마 l2 주소값) 형식을 사용하라고 되어있습니다.
자세한건 매뉴얼 페이지를 =33
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
댓글 달기