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 바이트의 데이터를 복사하려고하면 실패하고 응용 프로그램이 충돌합니다. 이 필드가 어떻게 사용되는지 오해하니? 헤더의 주석은 "실제로 더 크다"고 말한 다음 고정 된 크기를 배열에 할당하는 이유는 무엇입니까?
좋습니다,'sockaddr'는 다소 일반적인 구조입니다. 실제로'sockaddr_in' 외에도. 테스트가 중단 된 경우 올바른 주소 패밀리가 설정되어 있는지 확인하십시오. 사용한 코드 또는 관련 비트를 게시하십시오. – trojanfoe