| [ CnUnix ] in KIDS 글 쓴 이(By): terzeron (microkid) 날 짜 (Date): 2002년 3월 16일 토요일 오전 01시 17분 56초 제 목(Title): Re: [Q] sizeof 문제... 1. 뭐, 억지로 한다면야 다음의 예제를 활용하시면 좋을 것 같군요. 솔라리스, FreeBSD(i386)에서 모두 작동합니다. 물론 FB는 리눅스처럼 little endian입니다. struct에 __attribute__((packed))를 준다거나 컴파일 옵션에 -fpack-struct를 주거나 #pragma pack(n)을 이용하면 구조체를 pack할 수 있습니다. 그러면 구조체의 크기 문제는 해결이 됩니다. (물론 byteorder 문제 여전히 남아 있습니다.) #include <stdio.h> #include <sys/types.h> int main() { struct __attribute__((packed)) ll { uint32_t b; uint64_t a; } lll; printf("uint64_t=%d\n", sizeof (uint64_t)); printf("uint32_t=%d\n", sizeof (uint32_t)); printf("lll=%d\n", sizeof (lll)); return 0; } 2. 그리고 htonl이 어셈블리어로 작성되어 있으니 64 bit용 htonll을 만든다 치면 32 bit 두 개로 쪼개고 그걸 htonl한 후에 두 개 integer의 순서를 바꿔서 붙이면 되겠습니다. long long htonll(long long source) { long pass; long nl; long long target; memcpy(&pass, ((long *) &source) + 1, sizeof (long)); nl = htonl(pass); memcpy(&target, &nl, sizeof (long)); memcpy(&pass, &source, sizeof (long)); nl = htonl(pass); memcpy(((long *) &target) + 1, &nl, sizeof (long)); return target; } 성능 보장 못 합니다. 대략의 아이디어를 구현한 정도이니까요. ^^ 그리고 swhan님 말씀대로 struct안에 있는 long long을 네트웍으로 보낸다는 것 자체가 아무래도 이상합니다. byteorder 문제가 찜찜하거든요. 전에도 이런 이야기가 나왔었지만 쌈빡한 해결책도 별로 없는 것 같구요. |