我在C++中使用IP地址檢測有一個有趣的問題。我用inet_pton函數和sockaddr_in結構。如果字符串是有效的IPv4或IPv6,函數將返回AF_INET或AF_INET6。否則返回零。字符串中的IP地址檢測(C++)
以下代碼無效。SIGSEGV當輸入有效時,IPv6地址(IPv4地址和無效地址正常)處於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功能這個問題?
是sockaddr_in6的比SOCKADDR_IN – stark 2014-11-08 21:53:49