2012-11-07 4 views
1

네트워크 전송을 위해 C로 구조체를 정의하고 싶습니다. 예를 들어, 가변 길이의 동물 이름을 포함하는 Animal 구조체를 전송하려고합니다.C에서 네트워크 통신을위한 구조 정의

AFAIK, 편도 구조체에 using a predefined length of char array 또는 using a buffer, 우리는 버퍼 을 (분석 할 수 예를 들면, 처음 4 바이트 동물 이름 동물 이름 다음의 길이, 및 다른 필드 '길이 및 다른 아르

struct Animal 
{ 
    char name[128]; 
    int age; 
} 

또는 :

struct Animal 
{ 
    int bufferLen; 
    char* pBuffer; 
} 

내 질문 : m 된 필드 '값), 후자의 방법의 장점은 코드 다음을 나타내는대로, 변수 이름 길이를 허용하는 것이다 y가 올바른 방향으로 접근합니까? 즉, 구조체를 전달하는 표준 방법이 있으며 더 좋은 방법이 있습니까?

나의 두 번째 질문은 다음과 같습니다. 패닝에주의해야합니까? 즉 #pragma pack(push/pop, n)을 사용합니까?

미리 감사드립니다. 당신이 고정 된 길이를 사용하는 경우

+1

C 또는 C++의 예제 직렬화 코드를 확인 하시겠습니까? 그것은 문제가된다. –

+0

두 가지 방법을 모두 사용하여 작동하게 할 수 있으며 둘 다 잘못 사용할 수 없습니다. pack pragma와 관련하여 다시 팩을 사용하거나 사용하지 않고 코드를 작성할 수 있습니다. – sashang

+3

일반적으로 원시 데이터 구조를 직접 전송하는 것은 좋지 않습니다. JSON, XML, XDR 등과 같은 직렬화 형식을 사용해야합니다. – Barmar

답변

3

은 모두 잘 동작하지만, 는 처리하기가 조금 더 쉽게,하지만 당신은 당신이 필요로하는 것보다, 예를 들어, 다음 코드는하는 4를 가정하면 더 많은 데이터를 보낼 수 있습니다sturct 포장 바이트 정수, 132 바이트 보내드립니다 : 단일 패킷에 메모리를 할당하고 포장하기 위해 더 많은 일을해야합니다 반면 가변 길이 필드에

//packed struct 
struct Animal { 
    char name[128]; 
    int age; 
}; 

Animal a = {"name", 2}; 
send(fd, &a, sizeof(a), 0); 
//and you're done 

을,하지만 당신은 바이트의 정확한 수를 보낼 수있을 것입니다 당신 이 경우 9 바이트를 원한다면 :

//not necessarily packed 
struct Animal { 
    char *name; 
    int age; 
}; 

//some arbitrary length 
int name_length = 50; 
//you should check the result of malloc 
Animal a = {malloc(name_length), 2}; 

//copy the name 
strcpy(a.name, "name"); 

//need to pack the fields in one buff  
char *buf = malloc(strlen(a.name)+ 1 + sizeof(a.age)); 
memcpy(buf, a.name, strlen(a.name)+1); 
memcpy(buf, &a.age, sizeof(a.age)); 

send(fd, buf, strlen(a.name)+ 1 + sizeof(a.age)); 
//now you have to do some cleanup 
free(buf); 
free(a.name); 

편집 : 이것은 물론 사용자가 직접 구현하려는 경우 라이브러리를 사용하여 데이터를 직렬화 할 수 있습니다. 또한 Beej's Guide to Network Programming

+0

설명해 주셔서 감사합니다! –

관련 문제