socket编程(C++)报错 'inet_addr': Use inet_pton() or InetPton() instead or define _WIN以及引起的知识整理

背景(简单的socket编程,使用C++实现TCP通讯时报错 错误 C4996 ‘inet_addr’: Use inet_pton() or InetPton() instead or define WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings server,VS2015套接字编程时error C4996错误处理链接中3个处理方法都不行)

环境(VS 2019,Win 10)

先直接放解决方案:
所以在IP地址赋值时,
①sockAddr.sin_addr.s_addr=htonl(2130706433);
②sockAddr.sin_addr.s_addr=16777343;
③sockAddr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
以上3句完全一样!

所以将报错语句由③改①或者②即可。但是该方法也只是绕过了这个坑,这个问题暂时还未完全解决。

由此引起的知识学习以及整理:

参考资料:
链接1:简单的TCP通讯——服务器向客户端发送信息,客户端接受信息(直接使用代码会报标题的错)
链接2:简单的TCO通讯——服务器向客户端发送信息,客户端接受后回复信息(直接使用代码client端服务器连接失败)
链接3:C++ socket编程指南——基础,通俗易懂但是读起来很奇怪的外文翻译
链接4:网络字节序与主机字节序的转换

socket通讯在代码中怎么实现呢?

  1. //创建套接字
   SOCKET serSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  1. //配置socket地址
   sockaddr_in sockAddr;
  • 完成以上过程后,socket配置完成——完成了下图中的第一步 socket()
    本文只讨论这一步
    socket工作流程

socket怎么配置呢?我们先来看以下变量

  1. SOCKET
/*
 * The new type to be used in all
 * instances which refer to sockets.
 */
typedef UINT_PTR SOCKET;//宏定义
typedef unsigned int UINT_PTR, *PUINT_PTR;//宏定义

配置方法:

 //创建套接字
	SOCKET s_server;
	s_server = socket(AF_INET, SOCK_STREAM, 0);
  1. sockaddr
    这个结构体是最基础的,但是难以使用,在这篇文章中不重要,代码如下:
/*
 * Structure used by kernel to store most
 * addresses.
 */
struct sockaddr {
        u_short sa_family;              /* address family */
        char    sa_data[14];            /* up to 14 bytes of direct address */
};
  • sa_family 是地址族,在这里我暂时只用 “AF_INET”(网络协议版本4,即IPv4地址系列)。
  • sa_data包含套接字中的目标地址和端口信息,是所有不同套接字地址结构的最大大小。
  • 配置方法:我母鸡啊。
    3.sockaddr_in
    上面那个结构体基础,但是难用,所以有了这个结构体sockaddr_in(这个结构体在本文中很重要),代码如下:
/*
 * Socket address, internet style.
 */
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

配置方法:

	//socket的地址信息
	sockaddr_in sockAddr;
	memset(&sockAddr, 0, sizeof(sockAddr));  //用0填充每一个字节
	sockAddr.sin_family = AF_INET;     //使用IPv4地址
	sockAddr.sin_addr.s_addr = htonl(2130706433); //具体的ip地址
	sockAddr.sin_port = htons(1234);   //具体的端口号

socket中IP地址怎么填

  • 那么关于IP地址,IP地址有两种表达方式,点分十进制和整型。
    127.0.0.1——这种表示方法叫点分十进制
    2130706433——这种表示方法叫整形,他是IP地址127.0.0.1的主机字节序表示方法
    16777343——这种表示方法也叫整形,他是IP地址127.0.0.1的网络字节序表示方法
    ping指令
    如图,我在ping 2130706433时,命令行会给我ping到127.0.0.1。
    “点分十进制“,“网络字节序”和“主机字节序”,这三者的转换方式如下:
    该图片来自链接4
    用于转换的函数:
    所以在IP地址赋值时,
    ①sockAddr.sin_addr.s_addr=htonl(2130706433);
    ②sockAddr.sin_addr.s_addr=16777343;
    ③sockAddr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
    以上3句完全一样!

所以将报错语句由③改①或者②即可。但是该方法也只是绕过了这个坑,这个问题暂时还未完全解决,等我再去学一学网络编程回头再来看这个问题!2019年6月7日

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值