字符串形式的IP地址检测(C+;+;) 我在C++中有一个有趣的IP地址检测问题。我使用了函数和结构。若字符串是有效的IPv4或IPv6,函数将返回AF_INET或AF_INET6。否则返回零

字符串形式的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 =

以下代码不起作用。当输入是有效的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函数时会出现什么问题?

在进行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;
}