TCP/IP를 통해 전송해야하는 열거 형 멤버가 포함 된 여러 가지 구조체가 많이 있습니다. 통신 종단점이 다른 운영 체제 (Windows XP 및 Linux)에서 다른 컴파일러 (gcc 4.x.x 및 MSVC 2008)를 의미하지만 두 프로그램 모두 동일한 헤더 파일을 형식 선언과 공유합니다.C에서 소켓을 통해 열거 형 값을 포함하는 구조체를 보내는 가장 좋은 방법은 무엇입니까
성능상의 이유로 구조를 내부적으로 비싼 직렬화 또는 스트리밍없이 직접 전송해야합니다 (아래 코드 샘플 참조).
그래서 두 컴파일러가 열거 형 멤버에 대해 동일한 내부 메모리 표현을 사용하는지 확인하는 것이 좋습니다 (즉 둘 다 32 비트 부호없는 정수를 사용). 두 엔드 포인트가 리틀 엔디안 maschines합니다이기 때문에 또는 엔디안 여기에 문제가되지 않습니다 ... 또한
//type and enum declaration
typedef enum
{
A = 1,
B = 2,
C = 3
} eParameter;
typedef enum
{
READY = 400,
RUNNING = 401,
BLOCKED = 402
FINISHED = 403
} eState;
#pragma pack(push,1)
typedef struct
{
eParameter mParameter;
eState mState;
int32_t miSomeValue;
uint8_t miAnotherValue;
...
} tStateMessage;
#pragma pack(pop)
//... send via socket
tStateMessage msg;
send(iSocketFD,(void*)(&msg),sizeof(tStateMessage));
//... receive message on the other side
tStateMessage msg_received;
recv(iSocketFD,(void*)(&msg_received),sizeof(tStateMessage));
...
- 이 문제를 해결하기 위해 더 나은 방법이 있는지.
- 팩 #pragma는 정렬 문제를 만족스럽게 해결합니다. 귀하의 답변
들으, 악셀
어, 팁 3, 4 들으! 맞습니다. 빌드 도구의 버전 번호가 유지 관리에 도움이 될 수 있습니다! (나는 이미 1,2,5를 돌보고있다.) – Axel
또한 데이터의 크기를 표준화하고 전송을 위해 그 크기의 정수로 /에서 캐스팅해야한다. – nategoose