2016-04-19 498 views
1


我試圖實現一個小型應用程序(服務器&客戶端),它應該通過以太網進行通信。
我爲服務器和客戶端之間的通信定義了我自己的「協議」。通過套接字接口接收不同的數據類型

現在我遇到了一些麻煩,在客戶端執行此協議(用C編寫)。 我更喜歡實現一個通用接收函數。這個函數應該會收到一個固定大小的「標題」。在這個頭部中,定義了「有效載荷大小」和「有效載荷類型」。我的接收函數分配所需的內存並接收完整的Payload。

到目前爲止這麼好。但現在我將分配接收的數據到一個特定的類型。我定義了不同的結構(每個Payload類型一個)。當結構只包含基元數據類型(整數)時,它可以很好地工作。但是,當我有一個混合類型(整數和char *的消息),我有一些麻煩訪問字符串。

一個小例子:在存儲器中的接收的有效載荷的樣子:

---- 
int (e.g. 0x42) 
---- 
int (e.g. 0x42) 
---- 
char (e.g. 'o') 
---- 
char (e.g. 'k') 
---- 
char (e.g. '\0') 
---- 

爲此,我所定義的結構:

typedef struct { 
int error; 
int obj; 
char* message; 
} payload; 

我分配具有以下澆鑄的接收數據:

payload* myPL = (payload*) receviedPayload; 

該投射適用於整數值,但不適用於電子郵件。 我看到char *(指針)和只有字符類型的問題。但我不知道如何才能做到這一點...... 此外,我更喜歡使用接收緩衝區中的數據,而不是複製數據。

有誰知道我該怎麼做?或者是否有人對使用不同有效負載和數據類型的套接字通信的實現有任何一般想法?

謝謝!

+1

你沒有通過電報發送'char * message'的值,這是發送者本地的內存地址,是嗎? – alk

+0

客戶端和服務器是否位於同一臺機器/同一架構上?如果不是,則發送'int'或其他數字類型的原始字節可能會導致與字節順序相關的問題([網絡字節順序與小端順序](https://en.wikipedia.org/wiki/Endianness) )。我喜歡用'struct'來解析,但我認爲這個問題在實際應用中可以忽略。 – Myst

回答

1

如果您想使用接收緩衝區中的數據而不進行復制,則一種方法是發送恆定大小的字符串。

typedef struct { 
int error; 
int obj; 
char message[MESSAGE_SIZE]; 
} payload; 
相關問題