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