[英]IP address detection in string (C++)
我在C ++中有一個有趣的IP地址檢測問題。 我使用了inet_pton函數和sockaddr_in結構。 如果字符串是有效的IPv4或IPv6,則函數將返回AF_INET或AF_INET6 。 否則返回零。
下面的代碼不起作用。 當輸入有效的IPv6地址(IPv4地址和無效地址都可以)時, SIGSEGV處於具有IPv6檢測的條件下。 刪除IPv4條件后,同樣的問題。
#include <string>
#include <iostream>
#include <arpa/inet.h>
using namespace std;
int isIP(string);
int main(int argc, char *argv[]){
string s = "::1";
int test = isIP(s);
return 0;
}
int isIP(string addr){
struct sockaddr_in sa;
if((inet_pton(AF_INET, addr.c_str(), &(sa.sin_addr))))
return AF_INET;
if((inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr))))
return AF_INET6;
return 0;
}
但是當功能IsIP像下面的代碼一樣更改時, 一切都可以 。
int isIP(string addr){
struct sockaddr_in sa;
cout << addr + "\n";
if(inet_pton(AF_INET, addr.c_str(), &(sa.sin_addr)))
return AF_INET;
if(inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr)))
return AF_INET6;
return 0;
}
要么
int isIP(string addr){
struct sockaddr_in sa, sa2;
if((inet_pton(AF_INET, addr.c_str(), &(sa.sin_addr))))
return AF_INET;
if((inet_pton(AF_INET6, addr.c_str(), &(sa2.sin_addr))))
return AF_INET6;
return 0;
}
要么
int isIP(string addr){
struct sockaddr_in sa;
int r1 = inet_pton(AF_INET, addr.c_str(), &(sa.sin_addr));
int r2 = inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr));
if(r1)
return AF_INET;
if(r2)
return AF_INET6;
return 0;
}
首先實現isIP功能的問題是什么?
如果進行ipv6測試,則必須將指針傳遞給struct in6_addr。
struct sockaddr_in sa;
這是IPv4的結構; 它沒有足夠的空間來容納IPv6地址,因此在這種情況下,您將越界。
恰好在函數中添加了更多代碼,恰好使該函數可以使用更多的內存-通過聲明另一個變量,或者觸發一些我們無法合理化的,實現定義的任意構造,因此,當您溢出sa
,正在溢出到進程所擁有的內存中,因此不會觸發訪問沖突錯誤。 但是,這仍然是非常錯誤的。
IPv6地址將被讀入struct in6_addr
; 一個包含在struct sockaddr_in6
,例如:
bool isIPv6(const string& addr)
{
struct sockaddr_in6 sa;
if (inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr)))
return true;
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.