c++ - 字符串中的IP地址检测(C++)

标签 c++ c network-programming

我对 C++ 中的 IP 地址检测有一个有趣的问题。我用了inet_pton功能和sockaddr_in结构。如果字符串是有效的 IPv4 或 IPv6,函数将返回 AF_INETAF_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 函数的第一次实现有什么问题?

最佳答案

在 ipv6 测试的情况下,您必须将指针传递给 struct in6_addr。

关于c++ - 字符串中的IP地址检测(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26822380/

相关文章:

C++引用变量声明语法推理

c - 我无法判断这个旋转功能是否按预期工作

c - tcp 客户端 服务器 p2p

python套接字错误: AF_INET address must be tuple,不是str

Python Scapy wrpcap - 如何将数据包附加到 pcap 文件?

c++ - 取值后程序停止

c++ - c++中成员函数模板的特化

c++ - 绘图 "higher-level"对象

c - 读取主函数中的参数时出现段错误

c - 如何从 XC16 上的自定义部分删除不需要的数据填充