[英]Socket Programming in C/C++ - receiving a message defined by a typedef struct
關於我的套接字程序的一個問題:我有一個...內部類...我猜(抱歉,從Java到C / C ++)這是:
typedef struct {
enum {Request, Reply} messageType;
unsigned int RPCId;
unsigned int procedure;
int arg1;
int arg2;
} RPCMessage;
我希望收到一個RPCMessage作為對通過UDP套接字發送的請求的響應。 目前,我收到的郵件包含以下代碼:
/* Recv a response */
fromSize = sizeof(fromAddr);
if ((respSize = recvfrom(sock, buffer, maxSize, 0, (struct sockaddr *)&fromAddr,
&fromSize)) != messageSize)
DieWithError("recvfrom() failed");
我應該注意這里的緩沖區是一個char數組。 我想要的是將收到的消息轉回RPCMessage ...所以我試過:
RPCMessage receivedMessage = (RPCMessage)buffer;
這並不是讓編譯器感到高興...將char數組中的那些字節排列回RPCMessage及其字段的正確方法是什么?
你有幾個選擇。 選項#1是復制緩沖區的內容:
RPCMessage receivedMessage;
memcpy(&receivedMessage, buffer, sizeof(receivedMessage));
選項#2是將指向char緩沖區的指針重新解釋為指向RPCMessage類型的指針:
RPCMessage *receivedMessage = (RPCMessage *)buffer;
選項編號#3是手動將緩沖區解析為RPCMessage
類的RPCMessage
。
對於選項#1和#2,您必須了解結構/字段填充,架構的對齊要求等。
首先,你正在處理原始字節,所以使用unsigned char數組,沒有意外的符號擴展。
其次,您需要一個指針類型來引用該緩沖區:
RPCMessage* receivedMessage = (RPCMessage*)buffer;
最后確保發送方和接收方使用相同的字節打包。 同樣,在執行上述操作之前,請確保已收到RPCMessage的所有數據。
注意:通常最好將字節從緩沖區中分解出來並在RPCMessage結構中生成接收數據,除非您知道SURE雙方都同意打包,字節序等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.