2012-11-07 44 views
1

我想在C中定義一個用於網絡傳輸的結構,例如我想要傳遞一個Animal結構,其中包含一個可變長度的動物名稱。在C中定義網絡通信的結構

AFAIK,一種方式是using a predefined length of char array,或using a buffer在struct,我們可以解析緩衝器(例如,前4個字節是所述動物名稱長度,其次是動物的名字,和其它字段的長度和其他字段的值),後一種方法的優點是,它允許變量名長度,如以下代碼表示:

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

或:

struct Animal 
{ 
    int bufferLen; 
    char* pBuffer; 
} 

我的問題是:是米你接近正確嗎?即有傳遞結構的標準方法,並且有更好的方法嗎?

我的第二個問題是:我需要注意paddding,即使用#pragma pack(push/pop, n)

在此先感謝!

+1

C或C++中的示例序列化代碼?這很重要。 – 2012-11-07 05:42:56

+0

你可以用兩種方式使它工作,它們都不是錯的。關於包裝雜注,你也可以使用包裝和不包裝來編寫代碼。 – sashang

+3

嘗試直接發送原始數據結構通常不是一個好主意。您應該使用序列化格式,例如JSON,XML,XDR等。 – Barmar

回答

3

都工作得不錯,但是,如果使用固定長度包裝sturct它使它稍微容易對付,但你可以發送更多的數據比你的需要,例如,下面的代碼,假設4字節整數,將發送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

感謝您的解釋! –