2016-12-28 2 views
2

모든 웹에서 C로 데이터를 직렬화하여 TCP/IP 소켓을 통해 구조체를 보낼 수있는 방법을 찾았습니다. 아무것도 찾을 수 없었습니다. 그러나 나는 이런 식으로 패킷의 비트 위치를 고칠 수 있으므로 "사실상"직렬화 할 수 있다고 생각합니다.C에서 malloc으로 직렬화

packet *datapkt = NULL; 
datapkt = (packet*)malloc(PKT_SIZE); // Allocation of memory with this size 
datapkt->field = data; 
...... 
send(datapkt); 
free(datapkt); 

누구에게 말해 줄 수 있습니까? 지금까지 내 프로젝트에서 작동하고 있습니다.

미리 감사드립니다.

+2

와이어를 통해 외부 호스트 인 [endianness] (https://en.wikipedia.org/wiki/Endianness) 및 플랫폼에 메모리 레이아웃 양식을 푸시 할 때주의해야 할 이유 목록이 있습니다 [ 패딩 및 포장] (http://stackoverflow.com/questions/4306186/structure-padding-and-packing) 목록 상단에 있습니다. 당신이하고있는 일이 "일하는"것이라면 우연이 아니라 의도적으로 그렇게하고 있는지 확인하십시오. – WhozCraig

답변

0

당신은 두 가지를 고려해야합니다 :

1. Endianness 
2. Compiler padding 

첫 번째 포인트는 데이터가 시스템의 엔디안에 따라 다른 형태에 걸릴하게됩니다. 바이트보다 큰 유형의 경우 문제입니다.

두 번째 단계에서 컴파일러가 구조의 멤버간에 바이트를 추가하지 않아야합니다. 이것은 컴파일러 pragma를 사용하여 수행 할 수 있습니다.

0

접근 방법에 심각한 결함이 있습니다. 구조의 메모리 레이아웃에는 영향을주지 않습니다. 컴파일러는 구조체 사이에 패딩 바이트를 추가 할 수 있습니다. 연결의 양 끝에 다른 컴파일러와 CPU가 있으면 간단한 구조체를 사용하는 방식이 실패합니다. 다른 하드웨어에서 다른 엔디안을 언급하는 것은 아닙니다.

따라서 좋은 생각이 아닙니다.

0

로컬 인터 스레드/프로세스 통신을 통한 직렬화를 위해 struct를 사용하는 것은 동일한 컴파일러 및 컴파일 플래그에서 정상입니다. 하지만 네트워크 통신에는 좋지 않습니다. 네트워크의 클라이언트가 다른 CPU 아치 또는 운영 체제를 가질 수 있으며 struct 구성원에 대한 메모리 할당이 다른 시스템에서 일정하다는 보장이 없습니다. 예를 들어 sizeof (int)는 X86 및 X86_64 또는 다른 아키텍처/컴파일러에서 다를 수 있습니다. 메모리 레이아웃은 컴파일러에 의해 정의되고 다른 운영 체제, 심지어 패딩 및 엔디안이 들어오고 메모리 레이아웃도 변경하는 경우에도 다를 수 있습니다. 이렇게하면

관련 문제