我正在嘗試通過 iovec sturct 通過 unix 域套接字發送一個 uint_32t 型別變數。
我的 iovec 宣告:
uint32_t request_id = 123456;
struct iovec io = { .iov_base = &request_id, .iov_len = sizeof(uint32_t) };
在接收方:
char dup[4];
struct iovec io = { .iov_base = dup, .iov_len = sizeof(dup) };
msg.msg_iov = &io;
當我列印時,msg.msg_iov[0].iov_base我每次都會得到不同的數字。
printf("msg.msg_iov[0].iov_base = %d\n", msg.msg_iov[0].iov_base); => 723905316
我想位元組到 uint32 的轉換有些問題?
uj5u.com熱心網友回復:
當我列印 msg.msg_iov[0].iov_base 時,我每次都會得到一個不同的數字。
是的,在發送方是 的地址,request_id在接收方是 的地址dup。然而,這些地址并不重要。它們僅用于告訴writev以及readv在何處讀取/寫入資料,并且每次啟動程式時它們通常會有所不同。
例子:
發件人:
uint32_t request_id = htonl(123456); // to network byte order from host byte order
iovec io = { .iov_base = &request_id, .iov_len = sizeof(uint32_t) };
writev(fd, &io, 1);
接收者:
uint32_t request_id;
iovec io = { .iov_base = &request_id, .iov_len = sizeof(uint32_t) };
readv(fd, &io, 1);
request_id = ntohl(request_id); // from network byte order to host byte order
uj5u.com熱心網友回復:
您的代碼正在列印地址,而不是整數。
假設沒有位元組序問題,那么這樣的事情應該可以作業
printf("msg.msg_iov[0].iov_base = %d\n", *(int32_t*)msg.msg_iov[0].iov_base);
這段代碼確實假設%d可以成功列印int32_t我認為不能保證是真的東西。如果這是一個問題,你可以試試這個
int temp = *(int32_t*)msg.msg_iov[0].iov_base;
printf("msg.msg_iov[0].iov_base = %d\n", temp);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/488799.html
