Windows XP 中的 inet_pton 或 InetPton 等价物是什么?

2024-04-07

我需要确定特定字符串是否是有效的 IPv4 或 IPv6 地址文字。如果我理解正确的话,在 POSIX 系统上执行此操作的正确方法是使用inet_pton将其转换为网络地址结构,看看是否成功。 Windows Vista 及更高版本有InetPton本质上做同样的事情。但据我所知,Windows XP 没有声明其中任何一个,而我需要能够在 XP 上正确执行此操作。那么,问题是使用什么系统函数来做到这一点?

最坏的情况是,我可以自己编写一个函数来解析它,但我更喜欢一个标准的系统函数,因此它经过了彻底的测试并正确处理所有极端情况等。微软不能仅仅宣布这一点已经够糟糕了inet_pton像其他人一样并与InetPton对于他们的新操作系统。


在 Windows XP 中您可以使用以下功能:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include <winsock2.h>
#include <ws2tcpip.h>


int inet_pton(int af, const char *src, void *dst)
{
  struct sockaddr_storage ss;
  int size = sizeof(ss);
  char src_copy[INET6_ADDRSTRLEN+1];

  ZeroMemory(&ss, sizeof(ss));
  /* stupid non-const API */
  strncpy (src_copy, src, INET6_ADDRSTRLEN+1);
  src_copy[INET6_ADDRSTRLEN] = 0;

  if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) {
    switch(af) {
      case AF_INET:
    *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;
    return 1;
      case AF_INET6:
    *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;
    return 1;
    }
  }
  return 0;
}

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
{
  struct sockaddr_storage ss;
  unsigned long s = size;

  ZeroMemory(&ss, sizeof(ss));
  ss.ss_family = af;

  switch(af) {
    case AF_INET:
      ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src;
      break;
    case AF_INET6:
      ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src;
      break;
    default:
      return NULL;
  }
  /* cannot direclty use &size because of strict aliasing rules */
  return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)?
          dst : NULL;
}

就是这样。与 ws2_32 库链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows XP 中的 inet_pton 或 InetPton 等价物是什么? 的相关文章

随机推荐

  • Visual Studio 格式化整个文件?

    有没有办法在 VS2008 中使用 CodeRush Express 发出关键命令来正确格式化整个文件 Use Ctrl K Ctrl D to format document keystroke Use Ctrl K Ctrl F to
  • 如何解释TensorFlow的卷积滤波器和跨步参数?

    我正在尝试了解 TensorFlow卷积 http www tensorflow org api docs python nn md convolution 特别是公式 shape output batch in height filter
  • 如何在一行中打印 numpy.array?

    我测试了 PyCharm 和 IDLE 它们都将第 7 个数字打印到第二行 Input import numpy as np a np array 1 02090721 1 02763091 1 03899317 1 00630297 1
  • 使用 rake 任务重置数据库

    我想使用 Heroku 的调度程序 https devcenter heroku com articles scheduler每天重置我的数据库一次 建议对调度程序使用 rake 任务 这是我尝试过的 task reset database
  • 创建一组链接的项目

    有一个购买不同产品的用户列表 我想按用户购买行为对商品进行分组 如果任何用户购买两个产品 则这些产品应属于同一组 购买链接产品 user item 1 cat food 1 cat toy 2 cat toy 2 cat snacks 10
  • Android:使列表视图顶部的视图与列表视图一起滚动

    我有一个显然可以滚动的列表视图 列表视图包含一些表单问题 一旦用户提交表单 我们就会在列表视图的顶部放置一个类似邮票的自定义视图 并阻止用户回答问题 但这在这里并不重要 邮票应该出现在列表视图的顶部 如屏幕顶部 并且可以以与列表视图相同的速
  • 使用 Groovy 从属性文件中获取值

    如何使用 Groovy 从属性文件中获取值 我需要一个属性文件 properties 其中文件名作为键 目标路径作为值 我需要在运行时解析密钥 具体取决于需要移动的文件 到目前为止 我可以加载看起来的属性 但无法从加载的属性中 获取 值 我
  • 由于地址已在使用错误,Activemq 无法运行

    如何解决错误 Java Runtime Oracle Corporation 1 7 0 05 E Program Files Java jdk1 7 0 05 jre Heap sizes current 1004928k free 99
  • 从文本字符串创建单词数组

    我想使用 PHP 将文本拆分为单个单词 您知道如何实现这一目标吗 我的做法 function tokenizer text text trim strtolower text punctuation a z0 9 result preg s
  • POSIX 标准对 atexit() 处理程序中的线程堆栈有何规定?操作系统的做法是什么?

    当我们的 UNIX C 程序需要紧急退出时 我们使用 exit 3 函数并安装 atexit 3 处理程序来进行紧急清理 这种方法工作得很好 直到我们的应用程序被线程化 此时 atexit 处理程序停止正常工作 我们通过试验了解到一个错误
  • 打印表达式并对其求值的宏(使用 __STRING)

    为了学习和演示 我需要一个打印其参数的宏and对其进行评价 我怀疑这是一个非常常见的案例 甚至可能是一个常见问题解答 但我找不到实际的参考资料 我当前的代码是 define PRINT expr fprintf stdout s gt d
  • 初始化成员变量

    我已经开始采用这种模式 template
  • 如何在 iphone safari 中检测照片/视频是从相机拍摄还是从相机胶卷导入

    在我的网站上我有一个file input标签上传照片 视频 当在 mobile safari 中打开网站并单击文件输入时 会打开一个包含 3 个选项的操作表take photo or Video choose Existing and ca
  • 正则表达式匹配日月和年

    我尝试了一些 Windows 日期格式 该格式依赖于区域设置 因此 为了匹配日 月和年 我开始使用正则表达式 我有一些非常基本的经验 我在Python中使用了正则表达式 我的日期格式是dd mm yyyy hh mm ss 为了匹配日 月和
  • HttpWebRequest 在授权标头中发送无参数 URI

    我正在从 NET 连接到 Web 服务 例如 var request HttpWebRequest WebRequest Create uri request Credentials new NetworkCredential usr pw
  • GXT 2.2 - 消息框按钮常量

    这是一个关于如何检测在 MessageBox Dialog 中单击了哪个按钮的问题 仅限 GX T 2 1 或 2 2 请不要使用 GXT 3 接听 理想情况下 这就是我进行确认对话框的方式 final MessageBox box Mes
  • Android KitKat HttpURLConnection 断开 AsyncTask

    在我的应用程序中 我使用下载文件HttpURL连接 http developer android com reference java net HttpURLConnection html in an 异步任务 http developer
  • 是否可以从 Django 请求检测浏览器刷新?

    是否可以在 Django 请求中检测用户的浏览器刷新 就其本身而言 我相信没有办法仅通过查看请求对象来知道页面是否已刷新 客户可以轻松打开该页面的第二个版本 您还必须保留有关所有请求的一些状态数据 以便比较时间戳等内容 但这只是对实际发生情
  • ASP.NET 2.0 会话超时

    已经有人在本论坛中提出了有关会话超时的问题 如果有人能再次澄清这一点 我将不胜感激 我有一个 asp net 2 0 应用程序 如果用户没有执行任何活动并按下页面上的按钮 他被重定向到 sessionExpired aspx 页面 那么 1
  • Windows XP 中的 inet_pton 或 InetPton 等价物是什么?

    我需要确定特定字符串是否是有效的 IPv4 或 IPv6 地址文字 如果我理解正确的话 在 POSIX 系统上执行此操作的正确方法是使用inet pton将其转换为网络地址结构 看看是否成功 Windows Vista 及更高版本有Inet