나는처럼 보이는 비트 필드가 다음비트 필드 값이 변경 소켓 C++를 통해 전송 될 때
typedef struct __attribute__((__packed__)) MyStruct {
unsigned int val1:14;
unsigned int val2:1;
unsigned int val3:1;
unsigned int val4:1;
unsigned int val5:1;
unsigned short aFullShort;
unsigned int aFullInt;
} MyStruct;
내가 네트워크를 통해이 값을 보내고, 때로는 보낸 사람이 (val1
가 설정되어 있다고 생각됩니다 것으로 나타났습니다를 보내기 전에 값을 인쇄하여 확인할 수 있음) 수신자는 val1
이 설정되어 있는지 확인하지 않습니다. 다음과 같이 전송을위한 코드는 다음과 같습니다
MyStruct* myStruct = new MyStruct(); //initialize fields here
sendto(sock, myStruct, sizeof(MyStruct), 0, ...);
다음과 독서에 대한 코드는 다음과 같습니다
unsigned char theBuffer[sizeof(MyStruct)];
recvfrom(aSocket, &theBuffer, sizeof(theBuffer), 0, ...);
소켓에서 바이트 읽은 후, 나는 MyStruct
에 바이트를 캐스팅 엔디안 수행 재 해석 aFullShort
및 aFullInt
에 대한 변환. 보낸 사람이 1로 설정하면 수신자가 val1
이 0이라고 생각하는 손상이 발생합니다. 왜 이런 일이 발생할 수 있습니까? 컴파일러가 발신자와 수신자에 대해 다른 패딩을 삽입 할 수 있습니까? 단일 비트 값의 엔디안에 대해 걱정할 필요가 있습니까?
발신자/수신자가 동일한 OS 및 동일한 컴파일러입니다. 비트 필드 레이아웃은 구현이 정의됩니다. –
@RichardCritten 보낸 사람과받는 사람이 동일한 호스트에서 실행되고 동일한 컴파일러를 사용하여 컴파일됩니다. 송신자와 수신자에 대해 두 개의 별도 바이너리가 작성되므로 컴파일러가 두 대상에 대해 서로 다른 최적화를 수행 할 수 있습니다. – user1832287
송신자에서'(char *) (void *) myStruct'를 덤프하고 수신자에서'theBuffer'를 덤프합니다. 바이트가 같습니까? 그렇다면 구조적 차이점을 지적합니다. – ikegami