CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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 문제가 찜찜하거든요. 
전에도 이런 이야기가 나왔었지만 쌈빡한 해결책도 별로 없는 것 같구요. 



[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.