字符串(C++)中的IP地址检测
IP address detection in string (C++)
我在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函数的第一次实现中,问题是什么?
在ipv6测试的情况下,您必须将指针传递到structin6_addr。
struct sockaddr_in sa;
这是IPv4的结构;它没有足够的空间容纳IPv6地址,所以在这种情况下,您会越界。
在函数中添加更多代码恰好为函数提供了更多内存—要么通过声明另一个变量,要么通过触发一些我们无法合理化的任意、实现定义的结构;因此,当您溢出sa
时,您将溢出到进程拥有的内存中,因此不会触发访问冲突错误。然而,这仍然是非常错误的。
IPv6地址将被读取到CCD_ 2中;一个包含在struct sockaddr_in6
中,因此,例如:
bool isIPv6(const string& addr)
{
struct sockaddr_in6 sa;
if (inet_pton(AF_INET6, addr.c_str(), &(sa.sin_addr)))
return true;
return false;
}
相关文章:
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- 使用 C++将 IP 地址附加到字符*
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- Rabbitmq 将本地主机更改为 IP 地址C++
- C++ - 使用代码块从文件中读取 IP 地址
- C 使用from_string创建IP地址的C 导致lambda错误
- 如何在解析过程中区分 IP 地址和域名
- 如何使用 asio 库获取 IP 地址的主机名
- IP地址匹配过滤功能
- 如何将C++ ulong 4 字节 IP 地址正确转换为 C# 类型
- 如何在NS3中设置节点的IP地址和数据?
- 如何从活动的 udp 连接获取远程 IP 地址和端口
- 无符号的 int 到 IP 地址字符串,不带 itoa/to_string/boost
- 如何在FD_SET内获取套接字的IP地址
- 使用Boost库中的PC中获取我的以太网设备IP地址的列表
- 使用静态IP地址时,ESP32 httpclient连接拒绝了
- C++检查有效的 IP 地址或 IP
- 如何使用 Poco::Net::HTTPSClientSession 绑定特定的源 IP 地址
- 如何在Windows上绕过主机文件获取真实的IP地址