背景(简单的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通讯在代码中怎么实现呢?
- //创建套接字
SOCKET serSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- //配置socket地址
sockaddr_in sockAddr;
- 完成以上过程后,socket配置完成——完成了下图中的第一步 socket()
本文只讨论这一步
socket怎么配置呢?我们先来看以下变量
- 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);
- 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 2130706433时,命令行会给我ping到127.0.0.1。
“点分十进制“,“网络字节序”和“主机字节序”,这三者的转换方式如下:
用于转换的函数:
所以在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日