![](/img/trans.png)
[英]Is there a way to convert void (*)(uint32_t, void (*)(uint32_t)) to std::function<void(uint32_t, std::function<void(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,只需在調用sendto
或bind
重新使用它,此轉換就可以正常工作。
要正確轉換地址,您需要使用ntohl
函數,它將從網絡轉換為主機字節順序,否則您的0.0.0.1地址在clientIpAddr中的值為0x1000000:
uint32_t clientIpAddr = ntohl(addr->sin_addr.s_addr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.