关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr

2023-11-16

VS2013中调试Socket代码时,遇到了点小问题:

问题代码为:

[cpp]  view plain  copy
  1. inet_ntoa(addrClient.sin_addr);  

生成错误消息为:

[plain]  view plain  copy
  1. error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings  
  2. 1>          c:\program files (x86)\windows kits\8.1\include\um\winsock2.h(1868) : 参见“inet_ntoa”的声明  

看到这条消息就有点懵了,之前在VS2010中好好的,怎么在这里就不行了。

然后试着:

1. 把SDL检查关闭,发现可以通过,但是error变成了warning。先说一下SDL关闭:在“项目”-“属性”-“配置属性”-“C/C++”-“常规”下,有一项“SDL检查”,把“是 (/sdl)”改为“否(/sdl-)”就可以了。

2. 加上语句: #pragma comment(lib, "ws2_32.lib")

SDL安全检查在VS2010中是没有的,从VS2012开始就有了。inet_pton和inet_ntop这2个IP地址转换函数,能够处理ipv4和ipv6,算是比较新的函数了,可以在将IP地址在“点分十进制”和“二进制整数”之间转换。SDL提示错误可能是推荐使用相对安全的函数吧。那么,关闭了SDL确实可以了,但warning还在啊,所以找个更好的办法。

首先根据提示看看“inet_ntoa”的声明,在头文件WinSock2.h中:

[cpp]  view plain  copy
  1. char FAR *  
  2. WSAAPI  
  3. inet_ntoa(  
  4.     _In_ struct in_addr in  
  5. );  

Inet_ntoa的参数是一个in_addr的结构体。这个结构体将一个点分十进制格式的IP地址转换为u_long类型,保存在S_addr中。

再看看inet_ntop的定义,在文件WS2tcpip.h中:

[cpp]  view plain  copy
  1. PCSTR  
  2. WSAAPI  
  3. inet_ntop(  
  4.     _In_                                INT             Family,  
  5.     _In_                                PVOID           pAddr,  
  6.     _Out_writes_(StringBufSize)         PSTR            pStringBuf,  
  7.     _In_                                size_t          StringBufSize  
  8. );  
第一个参数(Family)指定地址族,对于TCP/IP协议的套接字,地址族为AF_INET;第二个参数(pAddr)指向套接字的IP地址(sin_addr);第三个参数(pStringBuf)是字符串缓冲区;第四个参数(StringBufSize)指定缓冲区的大小,这里值为16,用来保存点分十进制格式的IP地址。

那么,修改后的代码为:

[cpp]  view plain  copy
  1. // char sendBuf[100];  
  2. // SOCKADDR_IN addrClient;  
  3.   
  4. inet_ntop(AF_INET, (void*)&addrClient.sin_addr, sendBuf, 16);  
再次编译就没有警告了。注:inet_ntop函数成功的话返回字符串的首地址,错误返回NULL。
inet_pton功能与inet_ntop正好相反,将“点分十进制” 转换为 “二进制整数”。
[cpp]  view plain  copy
  1. INT  
  2. WSAAPI  
  3. inet_pton(  
  4.     _In_                                      INT             Family,  
  5.     _In_                                      PCSTR           pszAddrString,  
  6.     _Out_writes_bytes_(sizeof(IN6_ADDR))      PVOID           pAddrBuf  
  7.     );  
注:inet_pton 函数成功的话返回1,参数无效返回0,错误返回-1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr 的相关文章

随机推荐

  • 对高精度PWM(HRPWM)的理解

    传统PWM的精度 假定CPU工作频率为100MHz PWM模块的计数频率也一样 则计数周期为10ns 假设PWM的开关频率为1MHz 使用向上计数模式 那么 计数周期PRD等于100 此时 比较值只能在0 100里面选 占空比的精度只有1
  • mysql语法之update

    Update 语句 1 作用 Update 语句用于修改表中的数据 语法 UPDATE 表名称 SET 列名称 新值 WHERE 列名称 某值 1 建表语句 create table table1 idd varchar 10 val va
  • Python自学第十一天——Bug

    作为新手自学Python的第十一天 技术低微 希望可以通过这种方式督促自己学习 个人学习环境 python3 9 PyCharm 2021 3 2 Community Edition 本文仅做Bug基本知识梳理和简单解决方法简述 具体Bug
  • 解释二叉树深度和高度

    今天小伙伴在群里问到 面试官问这个问题 我第一印象 这不是一回事吗 去查了查 竟然还真有区别 所以在此记录一下 高度和深度是相反的表示 深度是从上到下数的 而高度是从下往上数 我们先来看看高度和深度的定义 某节点的深度是指从根节点到该节点的
  • vmware中虚拟机网络使用NAT模式,使外部主机可以连接

    将虚拟机网络类型配置成 注意 如果不知道什么原因无法访问网络 关闭所有虚拟机 点击还原默认设置 重置网络 vmware点击 编辑 gt 虚拟网络编辑器 点击NAT设置可以查看NAT网络的网关 点击DHCP设置 应该不需要 因为我用的是静态I
  • 【独家源码】ssm科普网站14o1y计算机毕业设计问题的解决方案与方法

    本项目包含程序 源码 数据库 LW 调试部署环境 文末可获取一份本项目的java源码和数据库参考 系统的选题背景和意义 选题背景 科学普及是推动科学知识传播和科学素养提升的重要途径 随着互联网的快速发展 科普网站成为了人们获取科学知识和信息
  • Mat使用笔记

    一 基本操作 1 1 创建 cv Mat初识和它的六种创建方法 cv Mat matDes nHEIGHT nWID CV 8UC1 cv Scalar 0 创建 row 高 col 宽 cv Mat matDes cv Mat zeros
  • 【pytorch优化器】Adam优化算法详解

    转载自 https blog csdn net weixin 39228381 article details 108548413 仅作学习记录 文章目录 一 说明 二 Adam原理 1 梯度滑动平均 2 偏差纠正 3 Adam计算过程 三
  • 【OpenGL进阶】01.使用Shader绘制三角形

    在前一个阶段的文章中 主要是使用OpenGL的固定管线来实现了一系列的操作 内容并不复杂 十分好理解 接下来的进阶系列中 我们将使用shader代码来实现一些效果 首先通过shader来实现一个三角形的绘制 首先来看main cs 创建窗口
  • 老域名扫描软件-老域名采集挖掘工具

    老域名挖掘软件 老域名挖掘软件是一种可以帮助用户发现已过期或未续费的老域名的工具 以下是该软件主要特点 大数据分析 该软件通过大数据分析技术 深度挖掘互联网上的闲置老域名 发现可用的未续费或已过期域名 从而为用户提供更多的域名选择 全网搜索
  • Android studio 3.2 升级详解及Gradle配置

    一直在使用Android studio 2 3 1版本 因为工作开发使用的都是这个版本 所以在经历了N次提示更新后 依旧还是没有升级 直到今天终于忍不住了 因为Android Studio 3 2版本在这个月发布了 增加了很多新特性 具体参
  • halcon 测量

    dev set draw margin dev set line width 3 创建包含了检测的边缘ROI区域 注意所画的矩形区域的长轴要与检测边界垂直 Row 599 5 Column 1073 5 Phi rad 87 0643 Le
  • oracle number17,2018-10-17 oracle 常用语法函数总结

    1 Oracle正则匹配使用 PS 这条SQL可以通过正则匹对查询一下 表A的字段a是否有非数字的数据 有时候数据表的一些字段是varchar类型的 如果sql里用to number的话 就肯定会报无效数字的错误 select from 表
  • VS2008下的配置opencv

    openCV 2 2以及2 2以下版本 不自带编译好的dll动态库和lib静态库文件 其中的bin和lib都是未经编译的 还不能直接使用的 因此需要进行下载CMake来对于Opencv源代码进行重新编译 才能得到最终的dll和lib库文件
  • 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们

    设计模式之美 下 https www yuque com zcming123 uygxde cbwnad 这位猿 三连 再走吧 以下内容是为了让搜索引擎 检测到这篇文章 要阅读体验 请点击上面的连接 点击我 去我的语雀看 对了 我看到语雀那
  • Spring Boot 基础知识

    概述 什么是 Spring Boot Spring Boot 是 Spring 开源组织下的子项目 是 Spring 组件一站式解决方案 主要是简化了使用 Spring 的难度 简省了繁重的配置 提供了各种启动器 开发者能快速上手 Spri
  • STM32F103系列定时器通道对应IO汇总

    1 通用定时器 TIM2 Default Remap CH1 ETR PA0 PA15 CH2 PA1 PB3 CH3 PA2 PB10 CH4 PA3 PB11 TIM3 Default Remap CH1 PA6 PB4 PC6 CH2
  • 在Windows服务器上搭建Nuget私人服务器(超~详细)

    在Windows服务器上搭建Nuget私人服务器 一 使用VS2017 VS2019新建空白解决方案 操作如图 步骤一 这里以VS2019为例 打开VS2019 选择 创建新项目 选项 步骤二 选择 空白解决方案 点击 下一步 步骤三 填写
  • React中setState()更新状态的两种写法及相关问题

    1 setState updater callback 函数式的setState updater是一个返回stateChange对象的函数 如下代码所示 它接收的state和props都保证为最新 updater的返回值会与state进行浅
  • 关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr

    VS2013中调试Socket代码时 遇到了点小问题 问题代码为 cpp view plain copy inet ntoa addrClient sin addr 生成错误消息为 plain view plain copy error C