网络编程
棉猴
这个作者很懒,什么都没留下…
展开
-
getservbyname()函数与getservbyport()函数
getservbyname()函数与getserbyport()函数都是用来获取服务的信息。该信息用servent结构表示。1 servent结构servent结构的定义为typedef struct servent {char *s_name; char **s_aliases} SERVENT, *PSERVENT, *LPSERVENT;其中,变量s_name指...原创 2019-11-19 10:00:50 · 2227 阅读 · 0 评论 -
IP地址格式转换
通过RtlIpv4StringToAddressA()和RtlIpv4AddressToStringA()函数可以实现in_addr格式的IP地址与字符串格式的IP地址之间的互换。1 RtlIpv4StringToAddressA()函数1.1函数格式该函数的作用是将字符串格式的IP地址转换为in_addr结构的IP地址。该函数的格式为NTSYSAPI NTSTATUS RtlI...原创 2019-10-17 09:34:44 · 1873 阅读 · 4 评论 -
VS2015中基于TCP客户端的实现
在《VS2015中基于TCP服务端的实现》中实现了基于TCP的服务端。服务端通过调用listen()函数将套接字设置为监听模式,并且调用accept()函数等待客户端的连接。在基于TCP的客户端中,主要的流程包括创建客户端套接字和连接服务端两个步骤。1 创建客户端套接字通过socket()函数创建用于客户端的套接字。socket()函数的用法请参考《VS2015中基于TCP服务端的实现》。...原创 2019-03-05 11:35:50 · 4374 阅读 · 0 评论 -
VS2015套接字编程中 _WINSOCK_DEPRECATED_NO_WARNINGS的解决方法
使用VS2015进行套接字编程时,在使用了一些不推荐的老旧函数时,编译器会给出如下告警信息,如图1所示。图1 编译器告警信息以上告警信息的意思是,inet_addr()函数已经过期,推荐使用inet_pton()函数或者InePton()函数来替代该过期函数,或者定义_WINSOCK_DEPRECATED_NO_WARNINGS来不显示这个告警信息。1 添加预处理器宏定义在VS...原创 2019-02-26 16:03:20 · 4870 阅读 · 3 评论 -
VS2015套接字编程断开套接字连接
当服务端和客户端结束了发送接收数据之后,两端连接的套接字就可以断开了。断开已连接的套接字主要分为三个步骤:首先关闭套接字的发送和接收数据功能,接下来关闭套接字,最后释放Winsock动态库资源。1 关闭套接字发送和接收数据功能通过shutdown()函数关闭套接字的发送和接收数据的功能。该函数的格式为intshutdown(SOCKET s, inthow);其中...原创 2019-04-25 10:10:40 · 507 阅读 · 0 评论 -
VS2015中Winsock编程之优雅关闭套接字
1 优雅关闭套接字简介在《VS2015套接字编程断开套接字连接》中提到,可以使用shutdown()、closesocket()和WSACleanup()三个函数组合在一起关闭已经连接的套接字。在关闭套接字时,对于流套接字,可能会在数据队列中还存在未发送的数据,在关闭套接字之后,对端将无法接收到这些数据。优雅关闭套接字的作用是,当关闭套接字之前,将数据队列中还未发送的数据发送给对方,再关闭套接...原创 2019-04-25 10:15:13 · 1209 阅读 · 0 评论 -
VS2015中通过setsockopt()函数优雅关闭套接字
在《VS2015中Winsock编程之优雅关闭套接字》中提到了使用shutdown()、closesocket()和WSACleanup()三个函数组合在一起优雅关闭套接字的方法。除此之外还可以使用setsockopt()函数实现套接字的优雅关闭。1 LINGER结构setsockopt()函数含有一个LINGER结构类型的参数。1.1 简介LINGER结构包含了指定套接字的信息,...原创 2019-04-25 10:18:51 · 538 阅读 · 0 评论 -
VS2015中基于阻塞套接字的数据发送和接收(2-1)
在《VS2015中基于TCP客户端的实现》和《VS2015中基于TCP服务端的实现》中介绍了服务端将本端套接字设置为监听模式,客户端连接服务端,服务端接收客户端的连接。此时,客户端和服务端的套接字已经成功连接,接下来就是通过连接好的套接字进行数据发送和接收了。1 数据的发送通过send()函数或者WSASend()函数可以实现发送数据。WSASend()函数是Winsock2中的函数。Wi...原创 2019-04-25 10:26:56 · 420 阅读 · 0 评论 -
VS2015中基于阻塞套接字的数据发送和接收(2-2)
2 数据的接收与通过已连接的套接字发送数据的函数类似,通过已连接的套接字接收数据的函数也有两个,一个是recv()函数,另一个是WSARecv()函数,其中WSARecv()函数是Winsock2版本的函数。2.1 recv()函数recv()函数的作用是通过套接字接收数据。2.1.1 函数格式recv()函数的格式为intrecv(SOCKET s, char...原创 2019-04-25 10:29:28 · 366 阅读 · 0 评论 -
套接字地址族与sockaddr结构
1 套接字地址族地址族来自Address Family的翻译,可以看成是套接字的类型,即不同的套接字对应不同的地址族。每种类型的套接字都拥有自己独特的通信寻址方式。地址族的取值包括AF_INET、AF_INET6以及AF_UNSPEC等,这些值在Winsock2.h中定义。2 sockaddr结构sockaddr结构用于存储套接字地址。在Windows Vista之前的版本,socka...原创 2019-05-22 12:19:19 · 824 阅读 · 0 评论 -
Winsock套接字编程中的h_errno
在《C语言中errno与perror()函数》中提到,函数执行错误时,可以通过errno得到错误信息。但是对于Winsock套接字编程中,错误信息无法通过errno获取,而是通过WSAGetLastError()函数获取。为了与errno从命名上保持一致,在winsock.h中有如下定义#defineh_errnoWSAGetLastError()即WSAGetL...原创 2019-09-20 10:00:26 · 435 阅读 · 0 评论 -
VS2015中基于TCP/IP的服务端的实现(2-2)
3 监听套接字在绑定了套接字之后,接下来使用listen()函数将套接字设置为监听状态,等待客户端的连接。listen()函数的格式为intWSAAPI listen( SOCKET s, intbacklog );其中,参数s表示要设置监听状态的套接字;如果有多个客户端连接处于监听状态的服务端套接字,则服务端只能逐一进行处理。在处理某个连接时,其它的客户端连接只能在队列中等待,...原创 2019-01-31 11:53:10 · 1243 阅读 · 4 评论 -
VS2015中基于TCP/IP的服务端的实现(2-1)
在C/S(客户端/服务端)模式中,包含基于连接和基于非连接两种通信模式。基于连接的通信是可靠通信,其依赖的协议是TCP/IP协议。基于TCP/IP协议的服务端工作流程包括创建套接字、绑定套接字、接听套接字和接收客户端的连接等步骤。1 创建套接字创建套接字的方法请参考《Winsock网络编程创建套接字》。2 绑定套接字使用“1创建套接字”中介绍的方法创建了指定协议的套接字之后,此...原创 2019-01-31 11:50:07 · 2044 阅读 · 0 评论 -
主机字节序与网络字节序
1 主机字节序主机字节序(host-byte)指的是处理器存储数据的字节顺序。对于Inter x86处理器来说,将数据的不重要的部分保存在低地址,重要的部分保存在高地址,即低地址中保存的是数据的低字节位,高地址保存的是数据的高字节位。int ip_Address_hostbyte = 0x12345678;此时,Inter x86处理器按照如图1的格式来保存变量ip_Address_...原创 2018-09-18 16:38:19 · 4754 阅读 · 3 评论 -
VS2015创建套接字错误代码10013的处理方法
socket()函数可以用来创建套接字。在Windows10+VS2015中,有些程序需要管理员身份才能正确运行。如果没有管理员身份,不会成功创建套接字,socket()函数的返回值是SOCKET_ERROR。使用WSAGetLastError()函数获取到的错误代码是10013。解决该问题的方法请详见《VS2015中使用管理员身份运行程序》。使用该文介绍的方法修改后,编译得到的应用程序图...原创 2018-09-14 16:17:12 · 4512 阅读 · 0 评论 -
VS2015实现套接字完成端口模型(4-1)
完成端口是套接字的一种模型。利用套接字的完成端口模型,可以在套接字上实现重叠I/O操作。1 完成端口简介1.1 传统C/S模式在传统的C/S模式中,一旦有客户端连接服务端,服务端将创建一个线程来处理与该客户端的I/O操作。如果有多个客户端连接服务端时,服务端将会创建多个线程。多个线程间的切换会占据CPU的大量处理时间,而线程的创建和销毁也会消耗大量的CPU时间。1.2 完成端口模型...原创 2018-07-04 14:29:11 · 547 阅读 · 0 评论 -
VS2015实现套接字完成端口模型(4-2)
源代码下载地址 3 代码实现在VS2015中创建一个“Win32控制台应用程序”,并添加MFC的头文件,如图2所示。将该程序命名为“IOCP_Server”。图2 添加MFC公共头文件3.1 添加套接字头文件在stdafx.h中添加套接字编程所需的头文件和动态库。#include <WinSock2.h>#pragma comment(lib, "...原创 2018-07-04 14:37:02 · 462 阅读 · 0 评论 -
VS2015实现套接字完成端口模型(4-3)
代码下载地址3.4 创建服务线程在创建了完成端口之后,接下来就要创建“1 完成端口简介”中提到的线程池中的服务线程。SYSTEM_INFO SystemInfo;GetSystemInfo(&SystemInfo);for (int i = 0; i < SystemInfo.dwNumberOfProcessors * 2; i++){HANDLE h...原创 2018-07-04 14:42:28 · 371 阅读 · 0 评论 -
VS2015实现套接字完成端口模型(4-4)
代码下载地址3.7 CClient类接下来为项目添加CClient类用于在套接字上实现数据发送和接收。3.7.1 创建CClient类在VS2015左侧“解决方案资源管理器”中选中“IOCP_Server”项目,之后在右键菜单中选择“添加->类”,如图3所示。 图3 为项目添加类 之后,在添加类的对话框中选择添加C++类,之后点击“添加”按键,如图4所示。...原创 2018-07-04 14:47:56 · 471 阅读 · 0 评论 -
Winsock网络编程头文件及库文件的设置
Winsock是Windows下网络编程的规范。使用Winsock可以实现基于TCP或UDP的通信。1 Winsock版本Winsock主要包含两个版本,即Winsock1和Winsock2。Winsock2是Winsock1的扩展,增加了很多异步函数。Winsock2的函数一般都有WSA的前缀,例如,在Winsock1中创建套接字的函数是socket(),在Winsock2中的函数是WS...原创 2018-09-20 09:33:14 · 11181 阅读 · 0 评论 -
Winsock网络编程Winsock动态库初始化
每个Winsock应用程序必须导入合适版本的Winsock DLL。如果在调用Winsock函数之前导入库函数失败,则函数会返回SOCKET_ERROR,该错误值是WSANOTINITIALISED。通过调用WSAStartup()函数来导入Winsock库文件。1 WSAStartup()函数WSAStartup()函数的格式如下所示int WSAStartup( WORD wVe...原创 2018-09-20 10:21:40 · 2026 阅读 · 0 评论 -
Winsock网络编程创建套接字
可以使用socket()函数或者WSASocket()函数来创建套接字。1 socket()函数与WSASocket()函数的区别这两个函数的功能都是创建网络通信所需的套接字,并且都是在winsock2.h头文件中定义。主要的区别在于socket()函数是通用的网络编程接口,采用unix系统标准,创建的套接字只能进行同步I/O操作;而WSASocket()函数是Windows专用的网络编程...原创 2018-09-20 10:47:36 · 1880 阅读 · 0 评论 -
Winsock网络编程获取主机信息
在Winsock网络编程中,可以通过主机的IP地址获取主机信息;也可以通过主机名获取主机信息。1 通过主机IP地址获取主机信息gethostbyaddr()函数和getnameinfo()函数可以通过主机IP地址获取主机信息。1.1 gethostbyaddr()函数该函数的作用是根据网络地址获取主机信息。1.1.1 函数格式该函数的格式为struct hostent...原创 2018-10-30 10:30:07 · 1494 阅读 · 0 评论 -
VS2015中IP地址转换函数
主机IP地址可以用标准的点型字符串来表示,如“192.168.1.1”,也可以用一个四个字节的整数或IN_ADDR结构来表示。可以使用inet_addr()函数和inet_ntoa()函数来实现这两种格式的转换,也可以使用新版本的inet_ntop()函数和inet_pton()函数来进行转换。1 inet_pton()函数1.1 函数格式该函数的作用是将标准的点型IP地址转换为二进制...原创 2018-09-10 16:03:04 · 1139 阅读 · 0 评论