簡體   English   中英

C / C ++中的套接字編程 - 接收由typedef結構定義的消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM