簡體   English   中英

在c中通過Windows套接字發送整數

[英]Sending integer over windows socket in c

我試圖在 C 中通過網絡發送一個整數(更具體地說, uint32_t字節)。 根據 Stack Overflow 上的其他示例和答案,我相信我正確發送了數據; 但是,在接收字節時,我無法將它們轉換/轉換為uint32_t 這是我嘗試的一個例子:

發件人:

    uint32_t num = htonl(100);
    char* converted_num = (char*)#
    send(client_sock, converted_num, sizeof(num), 0);

接收者:

    char buf[8192];
    recv(socket, buf, 8192, 0);
    uint32_t test = ntohl((uint32_t)&buf);
    printf("%d\n", (int)test);

接收器輸出一個大整數1755042816而不是正確的整數值“100”。 我究竟做錯了什么?

你正在投射一個指向一個不起作用的整數的指針。 *(uint32_t*)&buf如果你幸運的話可能會工作,但由於嚴格的別名違規,它是未定義的行為 C。

正確地說,您應該首先對uin32_t memcpy ,然后對其應用nthol

static inline uint32_t ntohl_ch(char const *X)
{
    uint32_t x; memcpy(&x,X,sizeof(x));
    return ntohl(x);
}

//...
    uint32_t test = ntohl_ch(&buf[0]);
//...

嚴格別名允許您將任何對象視為char數組(或有signed charunsigned char )。 反過來就不對了。 不允許在char數組中想象uint32_t ,您必須使用memcpy

優化編譯器會注意到你memcpy “荷蘭國際集團只是一個uint32_t和一個的Elid充分memcpy調用(支持直接MOV的登記或匯編指令的原始存儲器的直接應用程序)。

在這一行

    uint32_t test = ntohl((uint32_t)&buf);

您正在轉換並打印指向buf而不是接收到的數據的指針。 取消引用指針以獲取接收到的內容。

    uint32_t test = ntohl(*(uint32_t*)&buf);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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