2012-09-04 10 views
0

IEEE Std 1003.1-2008<sys/socket.h> 섹션은 CMSG_SPACE 또는 CMSG_LEN 매크로를 제공하고, 대신에 단지 말한다 않는다 :보조 데이터를 이동 가능하게 할당 할 수 있습니까?

보조 데이터 쌍의 시퀀스로 구성되어, 각각의 데이터 배열에 따르는 오는 cmsghdr 구조 이루어지는.

CMSG_SPACE없이 보조 데이터를 할당하거나 CMSG_LEN없이 메시지에 보조 데이터를 첨부 할 수있는 유용한 방법이 있습니까? 이 인용문은 크기가 (sizeof(struct cmsghdr)+ sizeof data)*nr_of_pairs 인 단일 버퍼 (데이터가 한 쌍당 변경 될 수 있음)가 각각 cmgshdr.cmsglen = sizeof(struct cmsghdr) + sizeof datamsg.msg_controllen = (sizeof(struct cmsghdr)+ sizeof data)*nr_of_pairs 인 것을 나타내지 만 CMSG_SPACE/CMSG_LEN에 대한 시스템 관련 설명서는 모두 정렬 문제가 있음을 나타냅니다. 이 방법으로 얻을 수 있습니다.

답변

1

OK, 할당 방법에 대한 추측을 할 수는 있지만 일반적으로 작동하지 않을 것입니다. (Linux에서 작동하지 않을 수 있지만 대신 CMSG_SPACE/CMSG_LEN을 사용해야했습니다.)

#include <stddef.h> 
#include <sys/socket.h> 

#ifndef CMSG_LEN 
socklen_t CMSG_LEN(size_t len) { 
     return (CMSG_DATA((struct cmsghdr *) NULL) - (unsigned char *) NULL) + len; 
} 
#endif 

#ifndef CMSG_SPACE 
socklen_t CMSG_SPACE(size_t len) { 
     struct msghdr msg; 
     struct cmsghdr cmsg; 
     msg.msg_control = &cmsg; 
     msg.msg_controllen = ~0ULL; /* To maximize the chance that CMSG_NXTHDR won't return NULL */ 
     cmsg.cmsg_len = CMSG_LEN(len); 
     return (unsigned char *) CMSG_NXTHDR(&msg, &cmsg) - (unsigned char *) &cmsg; 
} 
#endif 

가 Obvously이 함께 수행해야합니다 : 섹션 rfc2292 4.2의 다이어그램을 바탕으로, 나는 IEEE 표준의 구현 1003.1-2008을 준수에 이식해야한다고 생각 CMSG_SPACE 및 CMSG_LEN에 대한 다음과 같은 정의를 내놓았다 매크로,하지만이 아이디어를 보여줍니다 생각합니다. 이것은 나에게 정말로 해킹 같아서, CMSG_NXTHDR의 가능한 크기 검사 때문에 컴파일 타임 상수로 밀릴 수 없다. 따라서 POSIX의 다음 버전은 CMSG_SPACE와 CMSG_LEN을 정의해야한다. 부차적 인 데이터를 사용하는 모든 프로그램이이를 사용해야하기 때문이다. 어쨌든.

관련 문제