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

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

问题代码为:

inet_ntoa(addrClient.sin_addr);

生成错误消息为:

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

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

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

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

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

char FAR *
WSAAPI
inet_ntoa(
    _In_ struct in_addr in
);

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

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

PCSTR
WSAAPI
inet_ntop(
    _In_                                INT             Family,
    _In_                                PVOID           pAddr,
    _Out_writes_(StringBufSize)         PSTR            pStringBuf,
    _In_                                size_t          StringBufSize
);

第一个参数(Family)指定地址族,对于TCP/IP协议的套接字,地址族为AF_INET;第二个参数(pAddr)指向套接字的IP地址(sin_addr);第三个参数(pStringBuf)是字符串缓冲区;第四个参数(StringBufSize)指定缓冲区的大小,这里值为16,用来保存点分十进制格式的IP地址。

那么,修改后的代码为:

// char sendBuf[100];
// SOCKADDR_IN addrClient;

inet_ntop(AF_INET, (void*)&addrClient.sin_addr, sendBuf, 16);

再次编译就没有警告了。注:inet_ntop函数成功的话返回字符串的首地址,错误返回NULL。

inet_pton功能与inet_ntop正好相反,将“点分十进制” 转换为 “二进制整数”。

INT
WSAAPI
inet_pton(
    _In_                                      INT             Family,
    _In_                                      PCSTR           pszAddrString,
    _Out_writes_bytes_(sizeof(IN6_ADDR))      PVOID           pAddrBuf
    );

注:inet_pton函数成功的话返回1,参数无效返回0,错误返回-1。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-30 04:16:09

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

IP地址的三种表示格式及在Socket编程中的应用

转自:http://blog.csdn.net/hguisu/article/details/7449955 使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其实有三种不同的表示格式:  1)Ascii(网络点分字符串)-        2) 网络地址(32位无符号整形,网络字节序,大头)        3)主机地址 (主机字节序)   IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址,IP分组中的IP地址在网络

socket编程中recv与send函数

recv函数会将套接字缓冲区中的内容读出,但不清空,与read函数的区别在此.此函数有一个flag标志位,设为MSG_PEEK. send函数会将缓冲区中的内容写入到套接字,也不清空,与write函数的区别在此. 用这两个函数可以先接收或发送缓冲区中的内容,然后再用readn(此时缓冲区中的内容依然存在)与write函数去继续判断换行符/n,对缓冲区内容实现换行输出. echocli.c #include <unistd.h> #include <sys/types.h> #inc

socket编程中最常用的几个数据类型和转换函数

高位字节优先和低位字节优先.Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换. 第一个结构类型是:struct sockaddr 该类型是用来保存socket信息的 struct sockaddr {   unsigned short sa_family;   /* 地址族, AF_xxx */   char sa_data[14];  /* 14 字节的协议地址 */ }; sa_family一

Socket编程中,阻塞与非阻塞的区别

阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到来.这个行为叫阻塞.accept()方法将会阻塞服务器线程直到一个呼叫到来.当5个连接处理完闭之后,服务器退出.任何的在队列中的呼叫将会被取消. 非阻塞:非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回.比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,

TCP与UDP在socket编程中的区别 (网络收集转载)

http://blog.chinaunix.net/uid-26421509-id-3814684.html 一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  UDP程序结构较简单  流模式与数据报模式  TCP保证数据正确性,UDP可能丢包  TCP保证数据顺序,UDP不保证  部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息  拥有大量Client  对数据安全性无特殊要求  网络负担非常重,但对响应速度要求高  具体编程时

TCP与UDP在socket编程中的区别

一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  UDP程序结构较简单  流模式与数据报模式  TCP保证数据正确性,UDP可能丢包  TCP保证数据顺序,UDP不保证  部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息  拥有大量Client  对数据安全性无特殊要求  网络负担非常重,但对响应速度要求高  具体编程时的区别 socket()的参数不同  UDP Server不需要调用listen和accept  UDP收发数

SO_REUSEPORT和SO_REUSEADDR与socket编程中那些关于内核自动分配的...

前言: 本文分为三个章节,第一个章节主要是翻译总结汇总一位国外的老兄在Stack Overflow上的回答,但实际上Linux发展这么多年,文中的知识点已经过时且不准确了, 在第二章中通过实验,有更加准确的描述.但是,第一章节也不是全然无用,至少在了解SO_REUSEPORT和SO_REUSEADDR的发展上是有帮助的. 在第三章节中,做实验过程中需要验证一些其他的知识点,因此在这里做一个汇总. wxy:其实就是我研究完才发现文章写的不对,又不想浪费自己的研究成果,哈哈哈哈哈,hianghian

java socket编程中backlog的含义(zz)

使用Java.NET.ServerSocket能够方便的创建一个服务端套接字,这个类的构造函数有一个参数backlog.下面这段代码,在本机的8888端口上建立了一个套接字,backlog设置为5. [java] view plain copy // port:8888,backlog:5 ServerSocket server = new ServerSocket(8888, 5); 下面的Client是我们的测试类,会创建30个socket连接. [java] view plain copy

socket编程中write、read和send、recv之间的区别

http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用. 由此网络程序里最基本的函数就是read和write(int fd, const void*buf,size_t nbytes); write的返回值大于0,表示写了部分或者是全部的数据. 这样我们用一个while循环来不停的写入,但是循环过程中的buf参数和nbyte参数得由我们来更新.也就是说,网络写函数