c++网络通信

TCP/IP协议

  • OSI参考模型采用分层划分原则,将网络中的数据传输划分为7层,其中,物理层居于最下层,是最基础、核心的网络硬件层;应用层居于最上层,负责应用资源的管理。每一层使用下层的服务,并向上层提供服务。

在这里插入图片描述

  • TCP/IP通信协议
    采用如下4层的层级结构,每一层都呼叫它的下一层提供的网络来完成自己的需求。
    (1)应用层:应用程序间沟通的层,如简单电子邮件传输协议(SMTP)、文件传输协议(FTP)、网络远程访问(Telnet)协议等。
    (2)传输层:在此层中提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据包协议(UDP)等,TCP和UDP给数据包加入传输数据,并把它传输到下一层中。这一层负责传送数据,并且确定数据已被送达并接收。
    (3)互联网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),
    如网际协议(IP)。
    (4)网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

  • IP网际协议

32位的IP地址主要分为两部分:前缀和后缀。前缀表示计算机所属的物理网络,后缀确定该网络上的唯一一台计算机。在互联网上,
每一个物理网络都有一个唯一的网络号,根据网络号的不同,可以将IP地址分为5类,即A类、B类、C类、D类和E类。
其中,A类、B类和C类属于基本类,D类用于多播发送,E类属于保留类
在这里插入图片描述

  • TCP/IP协议的数据包
    (1)IP数据包。IP数据包在IP协议间发送,主要在以太网与网际协议模块之间传输,提供无链接数据包传输。
    IP协议不能保证数据包的准确发送,但能保证最大限度地发送数据。
    (2)TCP数据包。传输控制协议(TCP)是一种提供可靠数据传输的通信协议,它在网际协议模块和TCP模块之间传输,
    TCP数据包分为TCP包头和数据两部分。TCP包头包含源端口、目的端口、序列号、确认序列号、头部长度、码元比特、
    窗口、校验和、紧急指针、可选项、填充位和数据区。
    在发送数据时,应用层的数据传输到传输层,加上TCP的TCP包头,数据就构成了包文。
    报包是网际层IP的数据,如果再加上IP首部,就构成了IP数据包。
    TCP提供了一个安全可靠的、面向连接的、全双工的(包含两个独立且方向相反的连接)流传输服务,
    允许两个应用程序建立一个连接,并在全双工方向上发送数据和终止连接
    可靠传输服务软件都是面向数据流的。
    (3)UDP数据包。用户数据包协议(UDP)是一个面向无连接的协议,采用该协议后,两个应用程序间不需要先建立连接,
    它为应用程序提供了一次性的数据传输服务。UDP工作在网际协议模块与UDP模块之间,不提供差错恢复,不能提供数据重传,
    所以使用UDP的应用程序都比较复杂,如DNS(域名解析服务)应用程序
    UDP数据包分为伪首部和首部两个部分,伪首部包含原IP地址、目标IP地址、协议字、UDP长度、源端口、目的端口、
    包文长度、校验和、数据区,是为了计算和检验而设置的。
    伪首部包含IP首部一些字段,其目的是让UDP两次检查数据是否正确到达目的地。
    (4)ICMP数据包。ICMP被称为网际控制包文协议。作为IP协议的附属协议,
    ICMP用来与其他主机或路由器交换错误包文和其他重要信息,可以将某个设备的故障信息发送到其他设备上

    **套接字**
    
  • 套接字,实际上是一个指向传输提供者的句柄。在Winsock中,就是通过操作该句柄来实现网络通信和管理的

  • 套接字可以分为3种,即原始套接字、流式套接字和数据包套接字。
    原始套接字:在Winsock2规范中,它能够使程序开发人员对底层的网络传输机制进行控制,在原始套接字下接收的数据中含有IP头。
    流式套接字:提供了双向、有序、可靠的数据传输服务,该类型套接字在通信前需要双方建立连接,TCP协议采用的就是流式套接字
    数据包套接字:提供双向的数据流,但是它不能保证数据传输的可靠性、有序性和无重复性,UDP协议采用的就是数据包套接字。

Winsock的使用

  • 在使用套接字函数前,用户需要引用winsock2.h头文件,并链接ws2_32.lib库文件
    在这里插入图片描述
  • 常用的套接字函数
    (1)WSAStartup函数:该函数用于初始化ws2_32.dll动态链接库。在使用套接字函数之前,一定要初始化ws2_32.dll动态链接库
    在这里插入图片描述
     wVersionRequested:表示调用者使用Windows socket的版本,高字节记录修订版本,低字节记录主版本,
     例如,如果Windows socket的版本为2.1,则高字节记录1,低字节记录2。
      lpWSAData:是一个WSADATA结构指针,该结构详细记录了Windows套接字的相关信息
      在这里插入图片描述
    (2)socket函数。该函数用于创建一个套接字。语法如下:
    SOCKET socket ( int af,int type, int protocol );
    af:地址家族。通常为AF_INET。
    AF_INET:表示IPv4地址格式,通常用于Internet上的通信。
    AF_INET6:表示IPv6地址格式,支持更多的地址空间。
    AF_UNSPEC:未指定地址族,通常用于允许系统默认选择地址族
    在大多数TCP/IP网络编程中,AF_INET 是最常用的值
      type:通信类型。
      SOCK_STREAM:提供可靠的、面向连接的字节流服务。通常用于TCP协议。
    SOCK_DGRAM:提供无连接的、不可靠的数据报服务。通常用于UDP协议。
    SOCK_RAW:提供原始套接字,允许应用程序直接访问网络层数据。
      protocol:套接口所用的协议。如果用户不指定,可以设置为0。
      IPPROTO_TCP(TCP传输协议)
      IPPROTO_UDP(UDP传输协议)。
    如果设置为0,则系统会根据地址族和套接字类型自动选择一个合适的协议。
    注意:在大多数情况下,将 protocol 设置为0是安全的,除非你有特定的需求需要选择特定的协议。
      返回值:是创建的套接字句柄。
    (3)bind函数。该函数用于将套接字绑定到指定的端口和地址上。语法如下:
    int bind (SOCKET s,const struct sockaddr FAR* name,int namelen );
     s:套接字标识。
      name:sockaddr结构指针。该结构包含要结合的地址和端口号。
      namelen:确定name缓冲区的长度。
      返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
      (4)listen函数。该函数用于将套接字设置为监听模式。对于流式套接字,必须处于监听模式才能接收客户端套接字的连接。
    int listen ( SOCKET s, int backlog);
    s:套接字标识。
    backlog:等待连接的最大队列长度。
    例如,如果backlog被设置为2,此时有3个客户端同时发出连接请求,那么前两个客户端连接放置在等待队列中,
    第3个客户端得到错误信息。
    (5)accept函数。该函数用于接受客户端的连接。在流式套接字中,只有套接字处于监听状态,才能接受客户端的连接。
    SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen );
    s:套接字,处于监听状态。
    addr:sockaddr_in结构指针,包含一组客户端的端口号、IP地址等信息。
    addrlen:用于接收参数addr的长度。
    返回值:新的套接字,它对应于已经接受的客户端连接,对于该客户端的所有后续操作,都应使用这个新的套接字。
    (6)closesocket函数。该函数用于关闭套接字。
    int closesocket (SOCKET s);
    s:标识一个套接字。
    如果参数s设置有SO_DONTLINGER选项,则调用该函数后会立即返回,
    但此时如果有数据尚未传送完毕,会继续传递数据,然后才关闭套接字。
    (7)connect函数。该函数用于发送一个连接请求。
    int connect (SOCKET s,const struct sockaddr FAR* name,int namelen );
    s:套接字。
    name:套接字s想要连接的主机地址和端口号。
    namelen:name缓冲区的长度。
    返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
    用户可以通过WSAGE-TLASTERROR得到其错误描述。
    (8)htons函数。该函数将一个16位的无符号短整型数据由主机排列方式转换为网络排列方式
    u_short htons (u_short hostshort );
    hostshort:主机排列方式的无符号短整型数据。
    返回值:16位的网络排列方式数据。
    (9)htonl函数。该函数将一个无符号长整型数据由主机排列方式转换为网络排列方式。
    u_long htonl ( u_long hostlong);
    hostlong:主机排列方式的无符号长整型数据。
    返回值:32位的网络排列方式数据。
    (10)inet_addr函数。该函数将一个由字符串表示的地址转换为32位的无符号长整型数据。
    unsigned long inet_addr (const char FAR * cp);
    cp:一个IP地址字符串。
    返回值:32位无符号长整数
    (11)recv函数。该函数用于从面向连接的套接字中接收数据。
    int recv (SOCKET s,char FAR* buf,int len,int flags);
    s:套接字。
    buf:接收数据的缓冲区。
    len:buf的长度。
    flags:函数的调用方式。
    MSG_PEEK,表示查看传来的数据,在序列前端的数据会被复制一份到返回缓冲区中,但是这个数据不会从序列中移走。
    MSG_OOB,表示用来处理Out-Of-Band数据,也就是外带数据。
    (12)send函数。该函数用于在面向连接方式的套接字间发送数据。
    int send (SOCKET s,const char FAR * buf, int len,int flags);
    s:套接字。
    buf:存放要发送数据的缓冲区。
    len:缓冲区长度。
    flags:函数的调用方式。
    (13)select函数。该函数用来检查一个或多个套接字是否处于可读、可写或错误状态。
    int select (int nfds,fd_set FAR * readfds,fd_set FAR * writefds,fd_set FAR * exceptfds, const struct timeval FAR *
    timeout);
    nfds:无实际意义,只是为了和UNIX下的套接字兼容。
      readfds:一组被检查可读的套接字。
      writefds:一组被检查可写的套接字。
      exceptfds:被检查有错误的套接字。
      timeout:函数的等待时间。
    (14)WSACleanup函数。该函数用于释放为ws2_32.dll动态链接库初始化时分配的资源。
    int WSACleanup (void);
    (15)WSAAsyncSelect函数。该函数用于将网络中发生的事件关联到窗口的某个消息中。
    int WSAAsyncSelect (SOCKET s, HWND hWnd,unsigned int wMsg,long lEvent);
    s:套接字。
    hWnd:接收消息的窗口句柄。
    wMsg:窗口接收来自套接字中的消息。
    lEvent:网络中发生的事件
    (16)ioctlsocket函数。该函数用于设置套接字的I/O模式。
    int ioctlsocket(SOCKET s,long cmd,u_long FAR* argp);
    s:待更改I/O模式的套接字。
    cmd:对套接字的操作命令。
    FIONBIO,当argp为0时,表示禁止非阻塞模式;当argp为非0时,表示设置非阻塞模式。
    FIONREAD,表示从套接字中可以读取的数据量。
    SIOCATMARK,表示所有的外带数据都已被读入。这个命令仅适用于流式套接字,
    并且该套接字已被设置为可以在线接收外带数 据(SO_OOBINLINE)。
     argp:命令参数。
  • Winsock2新增的函数。

WSAAccept:accept函数扩展版本,支持条件接收和套接口分组。
 WSACloseEvent:释放一个事件对象。
 WSAConnect:connect函数的扩展版本,支持连接数据交换和QOS规范。
 WSACreateEvent:创建一个事件对象。
 WSADuplicateSocket:为一个共享套接口创建一个新的套接口描述字。
 WSAEnumNetworkEvents:检查是否有网络事件发生。
 WSAEnumProtocols:得到每个可以使用的协议信息。
 WSAEventSelect:把网络事件和一个事件对象连接。
 WSAGetOverlappedResu:得到重叠操作的完成状态。
 WSAGetQOSByName:为一个传输协议服务名提供相应的QOS参数。
 WSAHtonl:htonl函数的扩展版本。
 WSAHtons:htons函数的扩展版本。
 WSAIoctl:ioctlsocket函数的允许重叠操作的版本。
 WSAJoinLeaf:在多点对话中计入一个叶节点。
 WSANtohl:ntohl函数的扩展版本。
 WSANtohs:ntohs函数的扩展版本。
 WSARecv:recv函数的扩展版本,支持分散/聚焦I/O和冲抵套接口操作。
 WSARecvDisconnect:终止套接口的接收操作。如果套接口是基于连接的,得到拆除数据。
 WSARecvFrom:recvfrom函数的扩展版本,它支持分散/聚焦I/O和冲抵套接口操作。
 WSAResetEvnet:重新初始化一个数据对象。
 WSASend:send函数的扩展版本,支持分散/聚焦I/O和冲抵套接口操作。
 WSASendDisconnect:启动一系列拆除套接口连接的操作,并且可以选择发送拆除数据。
 WSASendTo:sendto函数的扩展版本,支持分散/聚焦I/O和冲抵套接口操作。
 WSASetEvent:设置一个数据对象。
 WSASocket:socket函数的扩展版本,以一个PROTOCOL_INFO结构作为输入参数,并且允许创建重叠套接口,它还允许创建套接口组。
 WSAWaitFoMultipleEvent:阻塞多个事件对象。

连接流

  • 面向连接流主要指通信双方在通信前先建立连接。建立连接的步骤如下:

创建套接字socket。
 将创建的套接字绑定(bind)到本地的地址和端口上。
 服务器端设置套接字的状态为监听状态(listen),准备接受客户端的连接请求。
 服务器端接受请求(accept),同时返回得到一个用于连接的新套接字。
 使用这个新套接字进行通信(通信函数使用send/recv)。
 释放套接字资源(closesocket)。
面向连接流的整个过程分为客户端和服务器端
在这里插入图片描述

  • 面向无连接的

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/360093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬取中国福彩网彩票数据并以图表形式显示

网页分析 首先打开中国福彩网,点击双色球,选择往期开奖栏目 进入栏目后,选定往期的奖金数目作为我们想要爬取的目标内容 明确目标后,开始寻找数据所在的位置 鼠标右击页面,打开网页源代码,在源代码中搜索…

<Rust><iced>在iced中显示gif动态图片的一种方法

前言 本文是在rust的GUI库iced中在窗口显示动态图片GIF格式图片的一种方法。 环境配置 系统:window 平台:visual studio code 语言:rust 库:iced、image 概述 在iced中,提供了image部件,从理论上说&…

手机删除照片后还可以恢复吗?5个步骤,教你掌握正确方法

手机里的照片是我们记录生活、珍藏回忆的宝库,但有时候我们可能会不小心删除照片,或者因为各种原因需要恢复已经删除的照片。别担心,这篇文章将为你提供关于手机照片恢复的全面指南,揭开手机照片的恢复之谜,重新拥有那…

前端:Element UI 与 Vuetify 的选择

vuetify优势 1、多端适配,Vuetify完全按照Material设计规范进行开发,每一个组件都经过精心设计,具有模块化、响应式和优秀的性能。 使用独特和动态的 布局 自定义您的应用程序,并使用 SASS 变量 自定义您的组件的样式。只需要做下…

AI入门系列:工具篇之ChatGPT的优秀的国内替代品

文章目录 一,智谱清言(ChatGLM)1,智谱清言简介2,[智谱清言地址,点我开始用吧](https://chatglm.cn/) 二,Kimi智能助手1,Kimi简介2,[Kimi地址,点我开始用吧](https://kimi.moonshot.c…

OnlyOffice-8.1版本深度测评

2024年6月19日,ONLYOFFICE 发布了最新版本 8.1,带来了超过30项新功能和432个 bug 修复。本文将详细评测该版本的新功能和改进,帮助用户全面了解这一升级带来的实际体验提升。 一、功能全面的 PDF 编辑器 PDF 是日常工作中不可或缺的文件格式…

牛拜克拉丝的wordpress免费企业模板

wordpress免费企业模板 挺简洁实用的wordpress免费企业模板,黄色模板搭建公司网站。 演示 https://www.wpniu.com/themes/40.html

​Python20 Numpy基础

NumPy(Numerical Python)是一个开源的Python库,广泛用于科学计算。它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具和函数。NumPy是数据分析、机器学习、工程和科学研究中不可或缺的工具之一,因为它提供…

如何挑选护眼灯?一分钟带你了解挑选护眼灯的六大准则!

小时候,对正确用眼知识一无所知,也不明白何种光线环境对眼睛最为友善,结果如今的近视度数已濒临千度大关。虽然早已习惯佩戴眼镜的生活,但近视所带来的诸多不便仍旧在日常生活中无处不在。因此,对于家中孩子的视力健康…

GPT-5:人工智能的新篇章,未来已来

目录 GPT-5:人工智能的新篇章,未来已来 引言 1.人工智能的快速发展和对现代社会的影响 2.OpenAI首席技术官米拉穆拉蒂关于GPT-5发布的消息 3.GPT-5对AI领域的潜在影响和期待 4.迎接GPT-5时代的准备 方向一:GPT-5技术突破预测 1.1 GPT-…

整数划分(递归)

相信很多人和我一样刚开始一直不懂最后一个递推式。 q(n, m)表示:整数n按照“分出来的数”不大于m的分法有多少种。 可以看出q(6,2)可以分为两种情况,一是加数不包含2的部分,这部分也是家数都小于2的部分。还有一部分是包含2的,那…

动态合批与静态合批的网格内存占用

1)动态合批与静态合批的网格内存占用 2)如何让游戏能自动调起手机内置的“游戏空间”或“游戏助手” 3)如何控制mesh.triangles值 4)怎么让旧的粒子原地不动 这是第391篇UWA技术知识分享的推送,精选了UWA社区的热门话题…

LONGHEADS:无需训练的多头注意力长文本处理框架

大模型(LLMs)在处理海量文本数据时展现出了前所未有的能力。然而这些模型在面对超出其训练时所见序列长度的长文本时存在两个主要问题:一是模型对于超出预训练长度的文本难以有效泛化,二是注意力机制的二次方时间复杂度导致计算成…

C#语言+net技术架构+ VS2019开发的微信公众号预约挂号系统源码 微信就医全流程体验 什么是微信预约挂号系统?

C#语言net技术架构 VS2019开发的微信公众号预约挂号系统源码 微信就医全流程体验 什么是微信预约挂号系统? 微信预约挂号系统是一种基于互联网的预约挂号平台,通过与医院信息系统的对接,实现了患者通过手机微信轻松预约挂号的功能。预约挂号系…

Flutter图像编辑器应用:创造生动美丽的照片体验

介绍 引言 想象一下,在一个阳光明媚的下午,与家人或朋友漫步在风景如画的街道上。拿出手机,迫不及待地捕捉这一刻的美好,按下快门,留下了一张充满回忆的照片。 然而,回到家后发现照片的亮度有些偏暗&…

Element 进度条样式优化

在开发后台管理系统时,经常会用到进度条这样一个控件,Element UI中提供了progress这样一个组件,如下图所示: 该组件默认的颜色会比较单一,为此时常需要对该组件的样式进行一些优化,以满足实际项目的需求。 …

芒果YOLOv10改进64:主干Backbone篇RepVGG结构:简单但功能强大的卷积神经网络架构

💡本篇内容:YOLOv10改进RepVGG结构:简单但功能强大的卷积神经网络架构 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv10 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv10 应部分读者要求,新增一篇RepVGG 论文理论部分 + 原创最…

LabVIEW机器视觉在质量控制中的应用

基于LabVIEW的机器视觉系统在质量控制中应用广泛,通过图像采集、处理和分析,自动检测产品缺陷、测量尺寸和识别标记,提高生产效率和产品质量。下面介绍LabVIEW机器视觉系统在质量控制中的实现方法、应用场景及其优势。 项目背景 在现代制造业…

生鲜水果行业wordpress主题

水果蔬菜wordpress外贸自建站模板 水果、脐橙、牛油果、菠萝、凤梨、鲜枣、苹果、芒果、瓜果、百香果wordpress外贸独立站模板。 https://www.jianzhanpress.com/?p3932 生鲜wordpress外贸出口网站模板 水果、蔬菜、肉蛋奶、水产、干货等生鲜产品wordpress外贸出口公司网站…

css-Echarts图表柱状图,X轴横坐标值显示不完全问题

1.问题 在Echarts图表中当横坐标数值过多,或者数值过长时会导致部分横坐标不显示。数据量少或简单会默认显示完全,当放大时会导致部分横坐标隐藏。 更改第一个Mon字段名 会发现偶数横坐标显示隐藏; 2.解决方法 2.1 在x横坐标中添加interval…