2014-04-08 5 views
2

Mac OS X (본질적으로 C 호출을 가로 채기)에서 약간의 개입을하고 있고 ping 응용 프로그램이 addrlen 값 16을 사용하여 sendto 함수를 호출하려고합니다. sys/socket.h 나는 sa_data 배열은 14 바이트까지 보유하고 있음을 명확하게 볼 수 있습니다 : 그것은 주석이 "실제로 더 큰"라고하지만 많이 나는 그것에 대해 할 수있는이 아니라고 나를 괴물struct sockaddr.sa_data가 너무 작게 나타납니다.

/* 
* [XSI] Structure used by kernel to store most addresses. 
*/ 
struct sockaddr { 
    __uint8_t sa_len;  /* total length */ 
    sa_family_t sa_family; /* [XSI] address family */ 
    char  sa_data[14]; /* [XSI] addr value (actually larger) */ 
}; 

.

ssize_t 
sendto(int socket, 
    const void *buffer, 
    size_t length, 
    int flags, 
    const struct sockaddr *dest_addr, 
    socklen_t dest_len); 

그리고 man 페이지는 특히 길이 값이 너무 오래 메시지가 될하는 경우 무엇을 부른다 : 어쨌든

는 사람이 페이지는 sendto를 함수에 대한 서명은 다음과 같습니다 보여줍니다 원자 적으로 배달됩니다. dest_len이 dest_addr.sa_data가 보유 할 수있는 것보다 큰 상황을 무시합니다.

호출자로부터 다른 dest_addr.sa_data에 16 바이트의 데이터를 복사하려고하면 실패하고 응용 프로그램이 충돌합니다. 이 필드가 어떻게 사용되는지 오해하니? 헤더의 주석은 "실제로 더 크다"고 말한 다음 고정 된 크기를 배열에 할당하는 이유는 무엇입니까?

+2

좋습니다,'sockaddr'는 다소 일반적인 구조입니다. 실제로'sockaddr_in' 외에도. 테스트가 중단 된 경우 올바른 주소 패밀리가 설정되어 있는지 확인하십시오. 사용한 코드 또는 관련 비트를 게시하십시오. – trojanfoe

답변

1

실제로는 struct sockaddr을 사용하지 않아야합니다. 실제 sockaddr_foo 구조를위한 스탠드 인 void *void과 같습니다.

+0

감사합니다. 이제 더 많은 의미를 갖기 시작했습니다. sendto와 같은 함수는 호출 될 때 사용할 구조를 어떻게 알 수 있습니까? 'sa_family'를보고 그것을 기반으로 올바른'sockaddr_foo'를 선택합니까? 'sa_family'를'sockaddr_foo'에 매핑시키는 헤더 파일이 있습니까? –

+0

새로운 질문을 추가하겠습니다. 당신의 대답은 내가 필요한 자원을 찾기 시작할 때 필요한 것입니다. –

관련 문제