首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >inet_ntop引发警告: inet_ntop():无效的in_addr值

inet_ntop引发警告: inet_ntop():无效的in_addr值
EN

Stack Overflow用户
提问于 2015-01-13 18:29:33
回答 1查看 1.9K关注 0票数 1

我正在尝试记录IP地址,每次使用inet_ntop()时都会收到以下错误:

警告: inet_ntop():无效的in_addr值

基于这条线,我尝试了以下代码,但所发生的只是我的所有IP地址都被标记为无效。

代码语言:javascript
复制
$is_valid = filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) || filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);

是否有任何方法有效地检查一个打包的IP地址,看看它是否有效?

EN

回答 1

Stack Overflow用户

发布于 2016-02-22 18:14:03

现在已经很晚了,但我自己也遇到了这个问题,希望它能帮助到其他人。

您的$row['ip']变量是打包(二进制)地址,但是filter_var需要字符串表示。这是一个问题,因为获得字符串表示的唯一方法是使用inet_ntop,这可能会发出警告……

我找到的唯一解决方案是,每次使用inet_ntop时都要禁用警告。函数返回false,这样您就可以检查这样做是否有问题。为了便于使用,我将它封装在一个函数中:

代码语言:javascript
复制
function isValidPackedIP($packed)
{
    $isValid = false;
    $ipStr = @inet_ntop($packed);
    if ($ipStr !== false) {
        $isValid = filter_var($ipStr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4|FILTER_FLAG_IPV6) !== false;
    }

    return $isValid;
}

用法:

代码语言:javascript
复制
$ip4 = inet_pton('127.0.0.1');
$ip6 = inet_pton('::1');
isValidPackedIP($ip4); // true
isValidPackedIP($ip6); // true
isValidPackedIP(null); // false, no warning
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27928999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档