字符串形式的IP地址检测(C+;+;) 我在C++中有一个有趣的IP地址检测问题。我使用了函数和结构。若字符串是有效的IPv4或IPv6,函数将返回AF_INET或AF_INET6。否则返回零
以下代码不起作用。当输入是有效的IPv6地址(IPv4地址和无效地址正常)时,SIGSEGV处于IPv6检测状态。删除IPv4条件后也会出现同样的问题字符串形式的IP地址检测(C+;+;) 我在C++中有一个有趣的IP地址检测问题。我使用了函数和结构。若字符串是有效的IPv4或IPv6,函数将返回AF_INET或AF_INET6。否则返回零,c++,c,network-programming,C++,C,Network Programming,以下代码不起作用。当输入是有效的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 =
#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函数时会出现什么问题?在进行ipv6测试时,必须将指针传递到struct in6\u addr
struct sockaddr_in sa;
这是IPv4的结构;它没有足够的空间容纳IPv6地址,因此在这种情况下,您将越界
向函数添加更多的代码恰好为函数提供了更多的内存—通过声明另一个变量,或者触发一些我们无法合理化的任意的、实现定义的构造—这样,当溢出sa
时,您正在溢出到进程拥有的内存中,因此不会触发访问冲突错误。然而,这仍然是非常错误的
IPv6地址将被读入6_addr中的结构中;一个包含在struct sockaddr\u in6
so中,例如:
bool isIPv6(const string& addr)
{
struct sockaddr_in6 sa;
if (inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr)))
return true;
return false;
}
6中的sockaddr_比6中的sockaddr_大
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;
}
struct sockaddr_in sa;
bool isIPv6(const string& addr)
{
struct sockaddr_in6 sa;
if (inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr)))
return true;
return false;
}