网络通信(套接字通信)(C/C++)

news2024/12/23 12:55:46

1.网络编程必知概念

1.广域网和局域网

        广域网:又称外网、公网。是连接不同地区局域网或城域网进行计算机通信的远程公共网络。

        局域网:在一定的通信范围内,有很个多计算机组成的私有网络就叫局域网。(这些计算机相互之间是可以通信的,但是不能直接访问外网(可以通过网线或代理服务器就可以访问外网))

2.互联网协议地址(IP)

       IP互联网协议地址(Internet Protocol):本质是一个整型数,用于表示计算机在网络中的地址。IP协议版本有两个:IPv4和IPv6

IPv4(Internet Protocol version4):

  • 使用一个32位的整型数描述一个IP地址,4个字节,int型
  • 也可以使用一个点分十进制字符串描述这个IP地址: 192.168.247.135
  • 分成了4份,每份1字节,8bit(char),最大值为 255
    • 0.0.0.0 是最小的IP地址
    • 255.255.255.255是最大的IP地址
  • 按照IPv4协议计算,可以使用的IP地址共有 2^{32}

IPv6(Internet Protocol version6):

  • 使用一个128位的整型数描述一个IP地址,16个字节

  • 也可以使用一个字符串描述这个IP地址:2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b

  • 分成了8份,每份2字节,每一部分以16进制的方式表示

  • 按照IPv6协议计算,可以使用的IP地址共有 2^{128}

3.在不同系统上查看主机对应的ip地址命令

在windows上查看ip的命令:ipconfig

在Linux上查看ip的命令:ifconfig

ping www.baidu.com    # 测试是否可用连接外网

ping 局域网ip地址        # 测试是否可用连接局域网

4.端口(port)

端口的作用是定位到主机上的某一个进程,通过这个端口进程就可以接收到对应的网络数据了

比如: 在电脑上运行了微信和QQ, 小明通过客户端给我的的微信发消息, 电脑上的微信就收到了消息, 为什么?

  • 运行在电脑上的微信和QQ都绑定了不同的端口
  • 通过IP地址可以定位到某一台主机,通过端口就可以定位到主机上的某一个进程
  • 通过指定的IP和端口,发送数据的时候对应的端口就能接收到数据了

注意:通过IP地址可以找到一个主机, 通过端口port定位到某一个进程

5.OSI/ISO网络分层模型

应用层

http ftp KCP MQTT Modbus(各种协议)

表示层

数据加解密

会话层

进程管理

传输层

端到端 端口指向具体进程 UDP / TCP

网络层

统一为上层提供同样的身份信息 IP地址

数据链路层 ​​​​​​​

数据的错误检错 规定身份信息(不同的网络拓扑结构身份信息就不同)
物理层 电气规范

 6.常用网络通信协议

  • TCP协议->传输层协议
  • UDP协议->传输层协议
  • IP协议->网络层协议
  • 以太网协议->网络接口层协议

7.socket编程

        socket套接字:一种通用的网络编程接口。

        socket 本身是一种进程间通信的方式,最开始可以作为本地的进程之间数据的传输方式。在本地可以通过进程 PID 来唯一标识一个进程,但是在网络中这是行不通的。

        而非本地的进程,该怎么标识自己那,就是前面我们说的 IP 地址和端口号了。

8.字节序

        字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,也就是说对于单字符来说是没有字节序问题的,字符串是单字符的集合,因此字符串也没有字节序问题。

        数据在计算机主要有两种存储方式大端和小端。

Little-Endian -> 主机字节序 (小端)

  • 数据的低位字节存储到内存的低地址位, 数据的高位字节存储到内存的高地址位;
  • 我们使用的PC机,数据的存储默认使用的是小端。

Big-Endian -> 网络字节序 (大端)

  • 数据据的低位字节存储到内存的高地址位, 数据的高位字节存储到内存的低地址位;
  • 套接字通信过程中操作的数据都是大端存储的,包括:接收/发送的数据、IP地址、端口。

9.字节序转换函数

#include <arpa/inet.h>
// u:unsigned
// 16: 16位, 32:32位
// h: host, 主机字节序
// n: net, 网络字节序
// s: short
// l: int

// 这套api主要用于 网络通信过程中 IP 和 端口 的 转换
// 将一个短整型从主机字节序 -> 网络字节序
uint16_t htons(uint16_t hostshort);    
// 将一个整型从主机字节序 -> 网络字节序
uint32_t htonl(uint32_t hostlong);    

// 将一个短整型从网络字节序 -> 主机字节序
uint16_t ntohs(uint16_t netshort)
// 将一个整型从网络字节序 -> 主机字节序
uint32_t ntohl(uint32_t netlong);

10.IP地址转换函数

// 主机字节序的IP地址转换为网络字节序
// 主机字节序的IP地址是字符串, 网络字节序IP地址是整形
int inet_pton(int af, const char *src, void *dst); 

参数:
        af: 地址族(IP地址的家族包括ipv4和ipv6)协议
                AF_INET: ipv4格式的ip地址
                AF_INET6: ipv6格式的ip地址
        src: 传入参数, 对应要转换的点分十进制的ip地址: 192.168.1.100
        dst: 传出参数, 函数调用完成, 转换得到的大端整型IP被写入到这块内存中
返回值:

        成功返回1

        失败返回0或者-1

#include <arpa/inet.h>
// 将大端的整型数, 转换为小端的点分十进制的IP地址        
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

参数:

        af: 地址族协议
                AF_INET: ipv4格式的ip地址
                AF_INET6: ipv6格式的ip地址
        src: 传入参数, 这个指针指向的内存中存储了大端的整型IP地址
        dst: 传出参数, 存储转换得到的小端的点分十进制的IP地址
        size: 修饰dst参数的, 标记dst指向的内存中最多可以存储多少个字节
返回值:

        成功: 指针指向第三个参数对应的内存地址, 通过返回值也可以直接取出转换得到的IP字符串
        失败: NULL

以下两个函数:只能转换ipv4格式的ip地址 

// 点分十进制IP -> 大端整型
in_addr_t inet_addr (const char *cp);

// 大端整型 -> 点分十进制IP
char* inet_ntoa(struct in_addr in);

 2.UDP通信流程

udp是一个无连接的,不可靠的,用户数据报协议,这个协议是一个传输层协议

  • 无连接:它仅仅将要发送的数据报传送至网络,并接收从网上传来的数据报,而不与远端的UDP模块建立连接。
  • 不可靠:UDP只提供数据的不可靠交付,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)
  • 用户数据报:用户数据报协议将应用程序产生的数据消息转化成数据包,然后经由IP发送,但它并不验证消息是否被正确发送

UDP通信流程图:

3.TCP通信流程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElementUI -- Mock.js介绍和使用与首页导航栏左侧菜单搭建

1.1 mockjs介绍 Mock.js是一个用于生成随机数据和模拟接口请求的JavaScript库。它可以帮助开发人员在前端开发过程中模拟后端接口的返回数据&#xff0c;以便进行前端页面的开发和测试。 Mock.js有两个重要的特性风靡前端: 数据类型丰富 Mock.js提供了一套简单易用的API&#x…

FL Studio21编曲软件好不好用?值得下载吗

现在的编曲界&#xff0c;鱼龙混杂&#xff0c;很多垃圾软件都来滥竽充数&#xff0c;能入流的编曲软件真的是屈指可数。而编曲业的缺口却又如此之大&#xff0c;所以各类货色都想入行分一杯羹。然而没有实力注定就没有市场而FL Studio又是一款非常著名&#xff0c;实力超群的编…

CTF_BUUCTF_MIS解题_05大白

题目地址&#xff1a;BUUCTF在线评测 文件下载解压之后发现真是一个大白 但是这个大白越看越不对劲&#xff0c;怎么下半身给整没了呢&#xff1f; 随机考虑到图片高度的隐写&#xff0c;杀手锏winhex上场&#xff0c;高度改高一下看看 flag已出现&#xff1a;flag{He1l0_d4_…

面试打底稿③ 专业技能的第三部分

简历原文 抽查部分 基本了解RabbitMQ、Elasticsearch等微服务技术&#xff0c;对分布式事务、分布式缓存等有所学习&#xff1b;熟悉数据库的基本操作&#xff0c;写过C#与数据库交互的项目&#xff1b; 模拟问答 1.你是如何保障消息可靠性的 从消息生产者到交换机&#x…

C语言 数据类型

变量声明 格式&#xff08;变量类型变量名称&#xff09; 变量类型&#xff1a;整数类型&#xff08;int&#xff09;&#xff0c;浮点数类型&#xff08;float&#xff09; float类型可以存储带小数的数字。 用printf()打印变量&#xff0c;使用%d来处理整数值&#xff0c…

AI指令百科全书:1000条AI指令,一次性全给你!

这是一位&#xff0c;国外博主哈桑 整理的&#xff0c;1000条ChatGPT实用指令&#xff0c;涵盖目前几乎所有的&#xff0c;主流提示需求。 全文超过40000字。 我把它们翻译成更适合大家理解的「中文版Prompt」&#xff0c;并根据具体的内容&#xff0c;拆解成一二级目录&…

【C++STL基础入门】list交换、翻转,排序、合并和拼接操作

文章目录 前言一、交换list二、翻转list三、排序list四、合并list五、拼接list总结 前言 在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;list是一个双向链表容器&#xff0c;提供了丰富的功能和操作。本文将介绍list容器在交换、翻转、排序、合并和拼接等方面的基…

Sip多按键对讲分机,洁净室专用对讲终端

Sip多按键对讲分机&#xff0c;洁净室专用对讲终端 嵌入式洁净室电话机广泛应用于手术室&#xff0c;实验室&#xff0c;制药厂车间&#xff0c;无尘车间等 环境要求高的场所&#xff0c;整机是SUS304不锈钢工艺&#xff0c;喇叭&#xff0c;按键&#xff0c;麦克风无间隙&…

三维模型3DTile格式轻量化顶点压缩主要技术方法分析

三维模型3DTile格式轻量化顶点压缩主要技术方法分析 三维模型顶点压缩是3DTile格式轻量化压缩的重要组成部分&#xff0c;能有效减小数据大小&#xff0c;提高数据处理效率。下面将详细分析几种主要的顶点压缩技术方法&#xff1a; 预测性编码&#xff1a;预测性编码也被称为差…

串口电平信号分析--一下看懂不同的串口通信信号

串口电平信号分析–一下看懂不同的串口通信信号

C#,数值计算——Primpolytest的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Primpolytest { private int N { get; set; } 32; private int nfactors { get; set; } 5; private ulong[] factors { get; set; } private int[] t { get…

九日集训 LCR.190 加密运算

计算机安全专家正在开发一款高度安全的加密通信软件&#xff0c;需要在进行数据传输时对数据进行加密和解密操作。假定 dataA 和 dataB 分别为随机抽样的两次通信的数据量&#xff1a; 正数为发送量负数为接受量0 为数据遗失 请不使用四则运算符的情况下实现一个函数计算两次…

MySQL索引看这篇就够了

能简单说一下索引的分类吗&#xff1f; 例如从基本使用使用的角度来讲&#xff1a; 主键索引: InnoDB 主键是默认的索引&#xff0c;数据列不允许重复&#xff0c;不允许为 NULL&#xff0c;一个表只能有一个主键。唯一索引: 数据列不允许重复&#xff0c;允许为 NULL 值&…

Vue.js2+Cesium1.103.0 十二、绑定多个 DOM 弹窗,并跟随视角实时更新位置

Vue.js2Cesium1.103.0 十二、绑定多个 DOM 弹窗&#xff0c;并跟随视角实时更新位置 Demo 基于 element-ui 的 Message 封装一个自定义弹窗&#xff0c;添加到页面中&#xff0c;并实时更新位置。 <template><divid"cesium-container"style"width: 1…

【RocketMQ】浅谈消息发送机制

【RocketMQ】浅谈消息发送机制 参考资料&#xff1a; 消息发送核心参数与工作原理详解 RocketMQ消息发送流程 RocketMQ 消息发送 原理详解 源码剖析 结合实际应用场景谈消息发送 《RocketMQ技术内幕》 文章目录 【RocketMQ】浅谈消息发送机制一、认识RocketMQ消息——Message二…

java语言对异常处理运行的初步探索(try-catch-finally)

​​​​​​异常处理机制 java中的异常处理机制使得即使程序出现异常&#xff0c;代码也能够继续执行下去而不是直接退出程序。下面我们先来简单的了解一下异常处理是怎么使用。 在引用异常处理之前&#xff0c;代码运行中存在异常会导致JVM直接中断该程序并输出异常信息&am…

stack的使用以及模拟实现

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

活动预告|Dragonfly 与你相约 2023 KubeCon Shanghai!

KubeCon CloudNativeCon Open Source Summit China 2023&#xff0c;由 Linux 基金会、CNCF 主办&#xff0c;将在 9 月 26-28 日于上海跨国采购会展中心盛大开幕。本次峰会将聚集全球社区&#xff0c;共同探讨云原生和开源领域的前沿洞察、核心技术与最佳实践&#xff0c;会…

Java基于SpringBoot的藏区特产销售系统的研究与实现

今天为大家带来的是基于 Java SpringBootVue 的藏区特产销售系统&#xff0c;大家有兴趣的可以看一下 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目…

ruoyi(若依)接口拦截路径配置,接口访问要授权,放开授权直接访问

1.找到文件SecurityConfig.java文件&#xff0c;里面配置相应的放行路径