【Linux Day14 UDP网络通讯】

UDP网络通讯

UDP报文结构:

在这里插入图片描述

  • 16位源端口:用于记录发送端的端口号(占用两个字节)
  • 16位目的端口:用于记录接收端的端口号(占用两个字节)
  • 16位UDP长度:确定UDP报文总长度,(占用两个字节)
  • 16位UDP校验和:接收端会首先知道即将发送来的数据的报文总长度,等数据来了之后,将数据的UPD校验和和已经知道的正确的报文总长度对比,如果不相同,直接丢掉UDP数据。(占用两个字节)

UDP编程流程

在这里插入图片描述

客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>int main()
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){exit(1);}struct sockaddr_in saddr;memset(&saddr,0,sizeof(saddr));saddr.sin_addr.s_addr = inet_addr("127.0.0.1");saddr.sin_family = AF_INET;saddr.sin_port = htons(6000); char buff[128] = {0};while(1){int len = sizeof(saddr);scanf("%s",buff);if(strcmp(buff,"end") == 0){break;}sendto(sockfd,buff,128,0,(struct sockaddr *)&saddr,len);memset(buff,0,128);int n = recvfrom(sockfd,buff,127,0,(struct sockaddr*)&saddr,&len);printf("n=%d,buff=%s\n",n,buff);}close(sockfd);
}

服务器端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>int main()
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){exit(1);}struct sockaddr_in saddr,caddr;memset(&saddr,0,sizeof(saddr));saddr.sin_addr.s_addr = inet_addr("127.0.0.1");saddr.sin_family = AF_INET;saddr.sin_port = htons(6000); int res = bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));if(-1 == res){exit(1);}char buff[128] = {0};while(1){int len = sizeof(caddr);int n = recvfrom(sockfd,buff,127,0,(struct sockaddr*)&caddr,&len);printf("n=%d,buff=%s\n",n,buff);sendto(sockfd,"OK",2,0,(struct sockaddr *)&caddr,len);memset(buff,0,128);}close(sockfd);
}

代码运行结果:

在这里插入图片描述

将服务端代码此处修改如下 在这里插入图片描述

运行结果:

结论:

  • UDP 是无连接的(不需要类似TCP的事先进行connect操作),所以每次发送数据都需要指定对端的地址(IP 和端口)。recvfrom()接收数据,每次都需要传给该方法一个地址结构来存放发送端的地址。recvfrom()可以接收所有客户端发送给当前应用程序的数据,并不是只能接收某一个客户端的数据。
  • UDP是面向数据报:传输的形式都是以数据报,不可分割也不可合并,发送端应用程序每执行一次写操作,UDP 模块就将其封装成一个 UDP 数据报发送。接收端必须及时针对每一个 UDP 数据报执行读操作,否则就会丢包。并且,如果用户没有指定足够的应用程序缓冲区来读取 UDP 数据,则 UDP 数据将被截断。
  • UDP是不可靠的(没有类似于TCP一样的机制(应答机制,超时重传,滑动窗口))

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

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

相关文章

Leetcode92:反转链表II(区间反转链表)

一、题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a…

排序——选择排序

基本思想 每一趟在待排序元素中选取关键字最小的元素加入有序子序列。 算法代码 #include <iostream> using namespace std;//选择排序 void SelectSort(int nums[],int n){int i,j,min;for(i0;i<n-1;i){ //一共需要进行 n-1 趟 mini; //记录最小元素的下…

Java split 分割字符串避坑

使用split进行字符串分割时需要注意2点 1、特殊字符作为分隔符时需要使用\\进行转义(如\\ -> \\\\; | -> \\| ) 特殊字符 .$|()[{^?*\\ 例如对"|"分隔 未转义 String str "01|02|03"; String[] strArr str.split("|");System.out.…

【面试官问】Redis 持久化

目录 【面试官问】Redis 持久化 Redis 持久化的方式RDB(Redis DataBase)AOF(Append Only File)混合持久化:RDB + AOF 混合方式的持久化持久化最佳方式控制持久化开关主从部署使用混合持久化使用配置更高的机器参考文章所属专区

99例电气实物接线及52个自动化机械手动图

给大家分享一些流水线设计中常见的一些结构&#xff0c;这些动态图很直观&#xff0c;有助于大家了解其原理&#xff0c;非常好懂。 1.家庭总电箱接线图 2.经典双控灯接线 3.五孔一开接线 4.电动机点动控制接线&#xff08;不安全&#xff09; 5.电动机自锁接线图&#xff08;…

SpringBoot集成H2数据库

1&#xff09;添加H2的依赖 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>compile</scope> </dependency>2&#xff09;添加连接配置&#xff0c;启用web控制台 spring:datasource:url…

【CSS】常见样式总结

一. 溢出隐藏 1.1 单行文本溢出 .content{max-width:200px; /* 定义容器最大宽度 */overflow:hidden; /* 隐藏溢出的内容 */text-overflow:ellipsis; /* 溢出部分...表示 */white-space: nowrap; /* 确保文本在一行内显示 */ }问题&#xff1a;display:flex 和 ellipsis 冲…

国内最全的Spring Boot系列之七

• 阿里巴巴前高级研发工程师 • 三家千万级互联网企业技术顾问 • MBTI/盖洛普技术专家 • 厦门某高校外聘教师 • 51CTO特约合作讲师 • 网易云课堂签约讲师 •《深入理解设计模式》作者 一转眼马上要过年了&#xff0c;回首2023年&#xff0c;感觉自己无所事事、碌碌无…

定时任务迁移Kubernetes指南

1、搞定基础镜像&#xff1a; docker pull openjdk:8-jre-alpine docker tag openjdk:8-jre-alpine 10.204.82.15/kubernetes/openjdk:8-jre-alpine docker push 10.204.82.15/kubernetes/openjdk:8-jre-alpine 2、应用打包mvn package 3、编写Dockerfile构建镜像 FROM 10.2…

OSI七层模型和TCP/IP四层模型

OSI的七层模型分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。其中应用层主要是为用户提供服务的&#xff1b;表示层负责数据处理&#xff0c;如编码解码&#xff1b;会话层负责管理应用程序之间的会话&#xff1b;传输层为两台主机进程之间的通信提供数据…

React实例之完善布局菜单(三)

接着上篇的内容继续。规划界面布局。界面分为三个部分&#xff0c;左边为菜单部分&#xff0c;右边上部有个 80 px 高度左右的功能区&#xff0c;下面是主内容区。 依据这个设计&#xff0c;我们进行下面的步骤&#xff1a; 在 SMenu项目中创建一个目录&#xff1a; SLayout, …

vcruntime140.dll有什么作用?vcruntime140.dll缺失的解决方法分享

解决因缺少vcruntime140.dll文件引起的问题实际上是相对简单的尽管最近有许多人在抱怨该文件频繁丢失且不知道该如何处理。作为一个责任编辑&#xff0c;我认为有很大的必要向大家清楚地解释一下。让我们从探索vcruntime140.dll文件缺少的修复方法吧。 一.msvcp140.dll的作用 …