【发布时间】:2014-11-08 21:38:50
【问题描述】:
我对 C++ 中的 IP 地址检测有一个有趣的问题。我使用了inet_pton 函数和sockaddr_in 结构。如果字符串是有效的 IPv4 或 IPv6,函数将返回 AF_INET 或 AF_INET6。否则返回零。
下面的代码不起作用。 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
标签: c++ c network-programming