網(wǎng)站swf怎么做seo搜索引擎優(yōu)化原理
如本文標題所示,不要使用 boost::asio::ip::address::from_string 函數(shù)來轉(zhuǎn)換字符串為IP地址,它可能導致崩潰。
這是因為?boost::asio::ip::address::from_string 函數(shù)實現(xiàn)并不安全有問題,在 Android 平臺NDK優(yōu)化編譯的情況下,100%會導致程序各種崩潰。
無論是傳遞 char*、還是 std::string,都會導致崩潰,跟字符串長度、或者結(jié)尾NULL字節(jié)是沒有任何關系的。
即便是在 GCC/VC++ 上面也有一定崩潰的風險,代替? boost::asio::ip::address::from_string 函數(shù)的實現(xiàn)可以參考本文下述的 C/C++ 安全實現(xiàn)。
即;通過C語言 posix/socket 函數(shù)庫來處理,并且把結(jié)果在轉(zhuǎn)換成?boost::asio::ip::address 就可以了。
源實現(xiàn):
// On the Android platform, call: boost::asio::ip::address::from_string function will lead to collapse, // Only is to compile the Release code and opened the compiler code optimization.boost::asio::ip::address StringToAddress(const char* s, boost::system::error_code& ec) noexcept {ec = boost::asio::error::invalid_argument;if (NULL == s || *s == '\x0') {return boost::asio::ip::address_v4::any();}struct in_addr addr4;struct in6_addr addr6;if (inet_pton(AF_INET6, s, &addr6) > 0) {boost::asio::ip::address_v6::bytes_type bytes;memcpy(bytes.data(), addr6.s6_addr, bytes.size());ec.clear();return boost::asio::ip::address_v6(bytes);}else if (inet_pton(AF_INET, s, &addr4) > 0) {ec.clear();return boost::asio::ip::address_v4(htonl(addr4.s_addr));}else {return boost::asio::ip::address_v4::any(); }}
}