2012-04-08 178 views
2

我想從我的客戶端程序發送一個結構到服務器程序(我正在寫服務器和客戶端程序)。此外,萬一重要的是我寫在一個32位的操作系統Linux上,客戶端和服務器都將運行在相同的系統上。這裏是我的結構:通過套接字客戶端服務器通信

struct msg_to_server { 
    int type_of_msg; 
    int type; 
    int flag; 
    int pid; 
    char name[MAX_WORD]; 
    char client_name[MAX_WORD]; 
    int child_timeout; 
    int numberKilled; 
}; 

我知道,如果我送一個int我需要使用htonl(INT)的無符號整數從主機字節順序轉換成網絡字節順序,但什麼我的情況下,做的結構? 任何幫助將不勝感激。

回答

4

如果你知道你正在發送和從同一類型的系統接收,那麼就沒有必要轉換整數爲網絡字節順序。如果您在不同的字節順序系統之間發送,這一點非常重要。

您可以在最低限度,只需發送整個結構的字節數超過插座,沒有翻譯步驟可言。

// client 
struct msg_to_server msg; 
send(sock, &msg, sizeof(msg), 0); 

// server 
struct msg_to_server msg; 
ssize_t n = recv(sock, &msg, sizeof(msg), 0); 

但是,要知道,如果你使用TCP,那麼該協議可能不會返回所有你recv()要求字節。您可能需要多次撥打recv()來檢索客戶端發送的所有字節。如果你使用的是UDP,你不必擔心這個問題,但是你會有其他的考慮,例如不可靠的交付。

+0

該溶液可以是脆弱的,即使發送者和接收者是相同的硬件和操作系統:例如如果發送程序使用與接收程序不同的編譯器設置進行編譯,那麼相同的結構可能在兩個系統上具有不同的內存佈局,這樣接收器上的字節就會有不同的解釋。 – 2012-04-08 21:12:10

+0

是的,這就是爲什麼我說「至少」。在兩臺機器之間發送數據時需要考慮許多可能的問題。不過,在受控環境下解決起來相當容易。 – 2012-04-08 21:16:21

+0

謝謝你們兩位。這些是有益的評論。我不知道。 – 2012-04-09 01:51:40

3

問:我知道,如果我送一個int我需要使用htonl(int)以 從主機字節順序轉換成unsigned int類型網絡字節順序, 但什麼我在的情況下做結構?

1)由於格雷格Hewgill正確地指出:

如果你知道你正在發送和從相同種類 系統的接受,那麼就沒有必要轉換爲網絡字節順序。

2)否則,如果你認爲你可能永遠要與非小端主機交換這種二元結構,則必須使用htonl /再用ntohl和htons/ntohs和在現場逐場的基礎;當你發送,當你收到。

3)最好方式是便攜式,但是,避免通過網絡發送二進制記錄。

這恰恰是XML或JSON等格式閃耀的地方。

而爲什麼互聯網標準(如HTTP和SMTP等)往往是文本爲基礎的

如果可能的話,我肯定會在主機之間交換文本記錄(例如XML)。

IMHO ...

相關問題