网络编程day2——基于TCP/IP协议的网络通信

TCP网络通信编程模型:

        计算机S                                                 计算机C

     创建socket对象                                   创建socket对象

     准备通信地址(自己的ip(非公网ip))      准备通信地址

                                    (计算机S的,与C在同一个局域网,或者S是公网ip)

      绑定sokect对象和地址                          ...

       监听                                                      ...

      等待连接                                              连接

      接收\发送数据                                     发送\接收数据

      关闭socket                                          关闭socket

    本地字节序(小端)与网络字节序(大端)的转换:

    #include <arpa/inet.h>

    uint32_t htonl(uint32_t hostlong);

    功能:把4字节的本地字节序转化成网络字节序

    uint16_t htons(uint16_t hostshort);    //本地是小端  网路通信是大端

    功能:把2字节的本地字节序转化成网络字节序 //h:home 本地  to  n:net  网络   s:short 端口号是2个字节大端数据

    uint32_t ntohl(uint32_t netlong);

    功能:把4字节的网络字节序转化成本地字节序

    uint16_t ntohs(uint16_t netshort);

    功能:把2字节的网络字节序转化成本地字节序

    //  网络通信时使用

    #include <netinet/in.h>

    struct sockaddr_in {

    __kernel_sa_family_t  sin_family; //

    __be16        sin_port;   // 端口号 需要大端数据

    struct in_addr    sin_addr;   // IP地址结构体

    };

    struct in_addr {

        __be32  s_addr;     //  IP地址数据 大端整数

    };

    点分十进制字符串的ip地址转换成小端整数、然后还需要转大端:

    "192.168.0.1"  (192<24)|(168<16)|(0<8)|(1)

    11000000 00000000 00000000 00000000     (192<24)

                     10101000 00000000 00000000     (168<16)

                                      00000000 00000000     (0<8)

                                                                      1     (1)

     11000000 10101000 00000000 00000001

    ip地址与整数的转换:

    in_addr_t inet_addr(const char *cp);

    功能:把字符串形式的点分十进制的ip地址转换成大端的整数形式的ip地址

    char *inet_ntoa(struct in_addr in);

    功能:把大端的ip整数转换成字符串形式的点分十进制的ip地址

UDP网络通信编程模型:

        计算机S                                  计算机C

     创建socket                              创建socket

     准备通信地址(自己的)             准备通信地址(S的地址)

     绑定socket和通信地址              ...

     接收\发送数据                          发送\接收数据  

     关闭socket                              关闭socket

UDP的数据发送函数

  ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);  功能:UDP专用的数据发送

    sockfd:socket描述符

    buf:待发送的数据内存首地址

    len:要发送的字节数

    flags:一般写0阻塞发送即可  

    dest_addr:发送目标的地址结构体

    addrlen:地址结构体的字节数

    返回值:成功发送的字节数,-1出现错误


 UDP数据接收函数

  ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);功能:UDP专用的数据接收函数

    sockfd:socket描述符

    buf:存储接收的数据内存首地址

    len:buf的大小

    flags:一般写0阻塞接收即可

    src_addr:获取发送者的地址  //输出型参数 需要准备一个结构体接

    addrlen:先要输入才能输出发送者的地址

    返回值:成功接收到的字节数 -1出现错误  0表示关闭通信

两者的区别:

1、TCP是面向连接的,UDP是面向无连接的;

2、UDP程序结构较简单;

3、TCP是面向字节流的,UDP是基于数据报的;

4、TCP保证数据正确性,UDP可能丢包;

5、TCP保证数据顺序,UDP不保证。  

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

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

相关文章

图像库 PIL(一)

Python 提供了 PIL&#xff08;python image library&#xff09;图像库&#xff0c;来满足开发者处理图像的功能&#xff0c;该库提供了广泛的文件格式支持&#xff0c;包括常见的 JPEG、PNG、GIF 等&#xff0c;它提供了图像创建、图像显示、图像处理等功能。 基本概念 要学…

C++类模板

这是一个简单的C程序&#xff0c;展示了如何使用Stack类模板来操作int和string类型的栈。 首先&#xff0c;我们定义了两个栈&#xff1a;一个用于int类型&#xff0c;另一个用于string类型。然后&#xff0c;我们使用push()方法将元素压入相应的栈中&#xff0c;并使用top()方…

延迟队列的理解与使用

目录 一、场景引入 二、延迟队列的三种场景 1、死信队列TTL对队列进行延迟 2、创建通用延时消息死信队列 对消息延迟 3、使用rabbitmq的延时队列插件 x-delayed-message使用 父pom文件 pom文件 配置文件 config 生产者 消费者 结果 一、场景引入 我们知道可以通过TT…

Mybatis学习|多对一、一对多

有多个学生&#xff0c;没个学生都对应&#xff08;关联&#xff09;了一个老师&#xff0c;这叫&#xff08;多对一&#xff09; 对于每个老师而言&#xff0c;每个老师都有N个学生&#xff08;学生集合&#xff09;&#xff0c;这叫&#xff08;一对多&#xff09; 测试环境…

[杂谈]-快速了解Modbus协议

快速了解Modbus协议 文章目录 快速了解Modbus协议1、为何 Modbus 如此受欢迎2、范围和数据速率3、逻辑电平4、层数5、网络与通讯6、数据帧格式7、数据类型8、服务器如何存储数据9、总结 ​ Modbus 是一种流行的低速串行通信协议&#xff0c;广泛应用于自动化行业。 该协议由 Mo…

力扣2. 两数相加

2. 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个…

16 个前端安全知识

16 个前端安全知识 去年 security course 上的是 React&#xff0c;然后学了一些 一些 React 项目中可能存在的安全隐患&#xff0c;今年看了一下列表&#xff0c;正好看到了前端也有更新&#xff0c;所以就把这个补上了。 一个非常好学习各种安全隐患的机构是 https://owasp…

「Docker」M1 Pro 打包docker image问题合集

运行docker 遇到 The requested images platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v4) and no specific platform was requested 说明打包的镜像没有 linux/amd64 解决方案&#xff1a;重新打包镜像 docker buildx build --platfor…

机器学习基础16-建立预测模型项目模板

机器学习是一项经验技能&#xff0c;经验越多越好。在项目建立的过程中&#xff0c;实 践是掌握机器学习的最佳手段。在实践过程中&#xff0c;通过实际操作加深对分类和回归问题的每一个步骤的理解&#xff0c;达到学习机器学习的目的 预测模型项目模板 不能只通过阅读来掌握…

机器学习的第一节基本概念的相关学习

目录 1.1 决策树的概念 1.2 KNN的概念 1.2.1KNN的基本原理 1.2.2 流程&#xff1a; 1.2.3 优缺点 1.3 深度学习 1.4 梯度下降 损失函数 1.5 特征与特征选择 特征选择的目的 1.6 python中dot函数总结 一维数组的点积&#xff1a; 二维数组&#xff08;矩阵&#xff09;的乘法&am…

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录 Docker 和 k8s 简介1、kubernetes 组件及其联系1.1 Node1.2 Pod1.3 Service 2、安装docker3、单节点 kubernetes 和 KubeSphere 安装3.1 安装KubeKey3.2 安装 kubernetes 和 KubeSphere3.3 验证安装结果 4、集群版 kubernetes 和 KubeSphere 安装5、kubectl 常用命令6、资…

浅谈下cdn以及防盗链问题

目录 一、什么是cdn 二、使用cdn带来的好处 三、CDN工作原理 四、cdn使用场景 五、流媒体CDN之防盗链问题 一、什么是cdn CDN&#xff08;Content Delivery Network&#xff09;是一种分布式网络架构&#xff0c;用于提供高效的内容分发服务。CDN通过将内容缓存在离用户最…

信息中心网络

人们就有了通过建立计算及网络来传输&#xff0c;共享知识&#xff0c;传递资料、信息的需求。由于需求相对简单&#xff0c;设计之初&#xff0c;并没有想象到后来计算机网络会发展的如此迅速&#xff0c;并且极大的改变人们的生活方式。从设计者的角度&#xff0c;并没有考虑…

Postgresql JSON对象和数组查询

文章目录 一. Postgresql 9.5以下版本1.1 简单查询(缺陷&#xff1a;数组必须指定下标&#xff0c;不推荐)1.1.1 模糊查询1.1.2 等值匹配1.1.3 时间搜索1.1.4 在列表1.1.5 包含 1.2 多层级JSONArray&#xff08;推荐&#xff09;1.2.1 模糊查询1.2.2 模糊查询 NOT1.2.3 等值匹配…

总结梳理HTTP状态码

前端开发中和后端联调时总会遇到一些状态码的问题&#xff0c;本文用于介绍一些常见的状态码&#xff0c;以及遇到这些状态码应该如何进行排查。 400 Bad Request - 请求无效。 表示客户端发送的请求存在语法错误&#xff0c;服务器无法理解或处理该请求的语法或参数。这通常…

恢复数据的利器:易我数据恢复终身技术版v16.2.0.0

EaseUS Data Recovery Wizard为全球提供数据恢复方案,用于误删数据数据,电脑误删文件恢复,格式化硬盘数据恢复,手机U盘数据恢复等,RAID磁盘阵列数据恢复,分区丢失及其它未知原因丢失的数据恢复,简单易用轻松的搞定数据恢复。 特点描述 - 易我数据恢复中文便携版&#xff0c;无…

STM32f103入门(10)ADC模数转换器

ADC模数转换器 ADC简介AD单通道初始化代码编写第一步开启时钟第二步 RCCCLK分频 6分频 72M/612M第三步 配置GPIO 配置为AIN状态第四步&#xff0c;选择规则组的输入通道第五步 用结构体 初始化ADC第六步 对ADC进行校准编写获取电压函数初始化代码如下 Main函数编写 ADC简介 ADC…

植物根系基因组与数据分析

1.背景 这段内容主要是关于植物对干旱胁迫的反应&#xff0c;并介绍了生活在植物体内外以及根际的真菌和细菌的作用。然而&#xff0c;目前对这些真菌和细菌的稳定性了解甚少。作者通过调查微生物群落组成和微生物相关性的方法&#xff0c;对农业系统中真菌和细菌对干旱的抗性…

windows主机和Ubuntu虚拟机共享设置

参考文章 Ubuntu Linux 与主机共享文件夹 vim 修改文件出现错误 “ E45: ‘readonly’ option is set (add to override)“ vim退出时报错“E212: Cant open file for writing”的解决办法 VMware 安装后&#xff0c;安装Ubuntu 20.04一路顺利。 1&#xff0c;在VMware设置…

Qt QScrollArea使用

在使用QScrollArea时&#xff0c;有几个注意事项需要考虑&#xff1a; 设置合适的小部件&#xff08;widget&#xff09;大小策略&#xff1a; 确保将要放置在QScrollArea中的小部件设置为合适的大小策略。这将确保小部件可以根据需要进行扩展&#xff0c;以适应滚动区域的大小…