簡體   English   中英

將sockaddr中的IP地址轉換為uint32_t

[英]Convert IP address in sockaddr to uint32_t

我想把存儲在struct sockaddr IP地址(v4)轉換為uint32_t

//struct sockaddr in_addr;
struct sockaddr_in* addr = (struct sockaddr_in*)&in_addr;

uint32_t clientIpAddr = static_cast<uint32_t>(addr->sin_addr.s_addr);
uint16_t clientPortNumber = addr->sin_port;

首先,我想知道這是否會起作用。

其次,將IP地址轉換為char[4]並將其轉換為uint32_t更好嗎?

第三,將IP地址0.0.0.1轉換為數字1嗎? 或其他因為字節順序?

它會起作用,是的。

根據文檔struct in_addr定義如下:

struct in_addr {
    uint32_t s_addr; /* address in network byte order */
};

所以是的,你可以將它分配給uint32_t(你甚至不需要把它投射)。

“網絡字節順序”位確實也告訴我們,如果你在一個不是大端的機器上運行它,你最終會得到垃圾。 你想通過ntohl()傳遞它來修復它。

只要您不嘗試打印clientIpAddr,只需在調用sendtobind重新使用它,此轉換就可以正常工作。

要正確轉換地址,您需要使用ntohl函數,它將從網絡轉換為主機字節順序,否則您的0.0.0.1地址在clientIpAddr中的值為0x1000000:

uint32_t clientIpAddr = ntohl(addr->sin_addr.s_addr);

暫無
暫無

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

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