网络、网络协议模型、UDP编程——计算机网络——day01

今天来到了网络编程,主要讲了网络、网络协议模型以及UDP编程

网络

网络主要是进行:数据传输和数据共享

网络协议模型

OSI协议模型应用层              实际发送的数据表示层              发送的数据是否加密会话层              是否建立会话连接传输层              数据传输的方式(数据报、流式)网络层              数据的路由(如何从一个局域网到达另一个局域网)        IP地址数据链路层          局域网下如何通信物理层              物理介质的连接TCP/IP协议模型   应用层              传输的数据传输层              传输的方式网络层              数据如何从一台主机到达另一台主机网络接口层          物理介质的连接

应用层

应用层主要的传输协议有:HTTP    超文本传输协议HTTPS   FTP     文件传输协议TFTP    简单文本传输协议SMTP    邮件传输协议MQTT    TELNET  ..

传输层

	UDP     用户数据报协议特点:1.实现机制简单2.资源开销小3.不安全不可靠TCP     传输控制协议特点:1.实现机制复杂2.资源开销大3.安全可靠

网络层

网络层这块主要讲一下IPv4

	IP地址:唯一标识网络中一台主机的标号IP地址:网络位 + 主机位子网掩码:用来标识IP地址的网络位和主机位子网掩码是1的部分表示IP地址的网络位子网掩码是0的部分表示IP地址的主机位网段号:网络位不变,主机位全为0,表示网段号广播地址:网络位不变,主机位全为1,表示广播地址IP地址类型:A类1.0.0.0 - 126.255.255.255子网掩码:255.0.0.0管理超大规模网络10.0.0.0 - 10.255.255.255 B类128.0.0.0 - 191.255.255.255子网掩码:255.255.0.0 管理大中规模型网络172.16.0.0 - 172.31.255.255C类192.0.0.0 - 223.255.255.255子网掩码:255.255.255.0管理中小规模型网络 192.168.0.0 - 192.168.255.255D类224.0.0.0 - 239.0.0.0用于组播E类240.0.0.0 - 255.255.255.255 用于实验

UDP编程

也是进程间socket套接字编程

1.发端

socket
int socket(int domain, int type, int protocol);功能:创建一个用来通信的文件描述符参数:domain:使用的协议族 AF_INET (IPv4协议族)type:套接字类型SOCK_STREAM:流式套接字SOCK_DGRAM:数据报套接字SOCK_RAW:原始套接字protocol:协议默认为0 返回值:成功返回文件描述符失败返回-1 
sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);功能:利用套接字向指定地址发送数据信息 参数:sockfd:套接字文件描述符buf:发送数据空间首地址len:发送数据的长度flags:属性默认为0 dest_addr:目的地址信息存放的空间首地址addrlen:目的地址的长度struct sockaddr_in {sa_family_t    sin_family; /* address family: AF_INET */in_port_t      sin_port;   /* port in network byte order */struct in_addr sin_addr;   /* internet address */};/* Internet address. */struct in_addr {uint32_t       s_addr;     /* address in network byte order */};返回值:成功返回实际发送字节数失败返回-1 
recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);功能:从套接字中接收数据参数:sockfd:套接字文件描述符buf:存放数据空间首地址flags:属性 默认为0 src_addr:存放IP地址信息的空间首地址addrlen:存放接收到IP地址大小空间的首地址返回值:成功返回实际接收字节数失败返回-1 
inet_addr、htons
inet_addr:in_addr_t inet_addr(const char *cp);功能:  将字符串IP地址转换为内存中的IP地址 htonsuint16_t htons(uint16_t hostshort);功能:将本地字节序转换为网络的大端字节序

eg:编写程序实现从终端接收字符串发送给 windows软件调试助手,并接受软件助手的回复,显示在终端屏幕上

#include"head.h"int main(void)
{int sockfd = 0;struct sockaddr_in recvaddr;	struct sockaddr_in addc;char tmpbuff[1024] = {"hello world"};	//发送的字符串char recvbuff[1024] = {0};ssize_t nsize = 0;socklen_t addrlen;sockfd = socket(AF_INET,SOCK_DGRAM,0);	//参数1:IPv4协议族;参数2:数据报套接字;参数3:协议,默认为0if(-1 == sockfd){perror("fail to socket");return -1;}recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);	//将端口50000转为网络的大端模式recvaddr.sin_addr.s_addr = inet_addr("192.168.1.104");//将字符串IP地址转为内存中的IP地址addrlen = sizeof(addc);nsize = sendto(sockfd,tmpbuff,strlen(tmpbuff),0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));if(-1 == nsize){perror("fail to sendto");return -1;}printf("成功发送 %ld 字节!\n",nsize);recvfrom(sockfd,recvbuff,sizeof(recvbuff),0,(struct sockaddr *)&addc,&addrlen);	//接收printf("%s",recvbuff);close(sockfd);return 0;
}

结果:
在这里插入图片描述

我们可以看到

发端:socket -> sendto -> close

收端: socket -> bind -> recvfrom -> close

UDP需要注意的细节点

1.UDP是无连接,发端退出,收端没有任何影响
2.UDP发送数据上限,最好不要超过1500个字节
3.UDP是不安全不可靠的,连续且快速的传输数据容易产生数据丢失

UDP包头长度:8个字节

 分别是:源端口号(2个字节)目的端口号(2个字节)长度(2个字节)校验和(2个字节)

eg:要求在不同主机中编写两个程序,实现全双工聊天功能
1.进入软件后接收当前用户的昵称
2.显示的格式为 对方用户昵称(对方IP:对方端口)>接收到的内容
3.用户输入".quit"退出聊天
4.网络通信时收发结构体
struct person
{
char name[32];
char text[512];
};

head.h
#ifndef __HEAD_H__
#define __HEAD_H__#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/in.h>struct person
{char name[32];char text[512];
};#endif

client.c

#include"head.h"int sockfd = 0;
struct sockaddr_in sendaddr;
struct sockaddr_in recvaddr;
ssize_t nsize = 0;
socklen_t addrlen = sizeof(recvaddr);void *threadSend(void *arg)	//发端
{struct person user;scanf("%s",user.name);nsize = sendto(sockfd,user.name,strlen(user.name),0,(struct sockaddr *)&sendaddr,sizeof(sendaddr));if(-1 == nsize){perror("fail to sendto");return NULL;}while(1){memset(&user.text,0,sizeof(user.text));scanf("%s",user.text);nsize = sendto(sockfd,user.text,strlen(user.text),0,(struct sockaddr *)&sendaddr,sizeof(sendaddr));if(-1 == nsize){perror("fail to sendto");return NULL;}if(!strcmp(user.text,".quit")){break;}}
}void *threadRecv(void *arg)
{struct person user;nsize = recvfrom(sockfd,user.name,sizeof(user.name),0,(struct sockaddr *)&recvaddr,&addrlen);		//首先接收名字if(-1 == nsize){perror("fail to recvfrom");return NULL;}while(1){memset(&user.text,0,sizeof(user.text));		//刷新nsize = recvfrom(sockfd,user.text,sizeof(user.text),0,(struct sockaddr *)&recvaddr,&addrlen);if(-1 == nsize){perror("fail to recvfrom");return NULL;}if(!strcmp(user.text,".quit")){break;}printf("%s %s:%d > %s\n",user.name,inet_ntoa(recvaddr.sin_addr),ntohs(recvaddr.sin_port),user.text);}
}int main(void)
{int ret = 0;pthread_t send;pthread_t recv;pthread_create(&send,NULL,threadSend,NULL);		//创建发送线程pthread_create(&recv,NULL,threadRecv,NULL);		//创建接收线程sockfd = socket(AF_INET,SOCK_DGRAM,0);	if(-1 == sockfd){perror("fail to socket");return -1;}sendaddr.sin_family = AF_INET;sendaddr.sin_port = htons(50000);sendaddr.sin_addr.s_addr = inet_addr("192.168.1.174");recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.1.152");ret = bind(sockfd,(struct sockaddr *)&recvaddr,sizeof(recvaddr));	//绑定接收端的IP地址和端口号if(-1 == ret){perror("fail to bind");return -1;}pthread_join(send,NULL);pthread_join(recv,NULL);close(sockfd);return 0;
}

结果:
在这里插入图片描述

以上就是今天内容!

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

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

相关文章

调研图基础模型(Graph Foundation Models)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 图基础模型&#xff08;Graph Foundation Models&#xff0c;简称 GFMs&#xff09; 是一种经过预训练的图大模型&#xff0c;旨在处理不同领域的图数据和任务。让我们详细探讨一下这个概念。 Github …

uniapp让输入框保持聚焦状态,不会失去焦点

使用场景&#xff1a;当输入框还有发送按钮的时候&#xff0c;点击发送希望软键盘不消失&#xff0c;还可以继续输入&#xff0c;或者避免因输入图片标签造成的屏闪问题 多次尝试后发现一个很实用的方法&#xff0c;适用input输入框和editor输入框 解决办法&#xff1a;把cli…

AXI4总线解析

一、读地址 AWVALID和AWREADY同时为高时&#xff0c;在这个上升沿&#xff0c;图中黄线&#xff0c;将接下来的数据写入地址40000000中。 在

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

DataFunSummit 2023:洞察现代数据栈技术的创新与发展(附大会核心PPT下载)

随着数字化浪潮的推进&#xff0c;数据已成为企业竞争的核心要素。为了应对日益增长的数据挑战&#xff0c;现代数据栈技术日益受到业界的关注。DataFunSummit 2023年现代数据栈技术峰会正是在这样的背景下应运而生&#xff0c;汇聚了全球数据领域的精英&#xff0c;共同探讨现…

Linux 文件操作命令

1 文件与目录操作 cd /home 进入 ‘/home’ 目录 cd .. 返回上一级目录cd ../.. 返回上两级目录cd - 返回上次所在目录cp file1 file2 将file1复制为file2cp -a dir1 dir2 复制一个目录 cp -a /tmp/dir1 . 复制一个…

【Qt】初识Qt

文章目录 一. 行业岗位介绍二. 什么是客户端&#xff1f;三. GUI 开发的各自技术方案四. 什么是框架&#xff1f;五. Qt 的发展史五. Qt 支持的系统六. Qt 的优点 一. 行业岗位介绍 二. 什么是客户端&#xff1f; 既然 Qt 是用来进行客户端开发的&#xff0c;那我们就要了解什…

如何保证ES和数据库的数据一致性?

在业务中&#xff0c;我们通常需要把数据库中的数据变更同步到ES中&#xff0c;那么如何保证数据库和ES的一致性呢&#xff1f;通常有以下几种做法&#xff1a; 双写 在代码中&#xff0c;对数据库和ES进行双写&#xff0c;并且先操作本地数据库&#xff0c;后操作ES&#xff…

Ubuntu20.04安装并配置vscode

Ubuntu20.04安装并配置vscode vscode安装miniconda安装创建虚拟python3.8环境pytorch和匹配的cuda安装 vscode安装 VSCode可以通过 Snapcraft 商店或者微软源仓库中的一个 deb 软件包来安装。 我们这里选用安装VSCode snap版&#xff0c;打开你的终端(CtrlAltT)并且运行下面的…

px2rem实现vue项目响应式布局

第一步 首先需要在项目中安装px2rem插件 npm install postcss-px2rem px2rem-loader --save 第二步 在项目src目录下新建util文件夹&#xff0c;在util文件夹下新建rem.js文件&#xff0c;内容如下&#xff1a; // rem等比适配配置文件 // 基准大小 const baseSize 14 //…

【机器学习300问】27、什么是决策树?

〇、两个预测任务 &#xff08;1&#xff09;任务一&#xff1a;银行预测偿还能力 当前&#xff0c;某银行正致力于发掘潜在的放贷用户。他们掌握了每位用户的三个关键特征&#xff1a;房产状况、婚姻状况以及年收入。此外&#xff0c;银行还拥有过往这些用户的债务偿还能力的…

Linux系统——LVS-DR群集部署及拓展

目录 引言 1.LVS的工作模式及其工作过程 2.列举出LVS调度算法 3.LVS调度常见算法&#xff08;均衡策略&#xff09; 3.1固定调度算法:rr&#xff0c;wrr&#xff0c;dh&#xff0c;sh 3.2动态调度算法:wlc&#xff0c;lc&#xff0c;lblc 4.LVS三种工作模式区别 一、I…

更快更强,Claude 3全面超越GPT4,能归纳15万单词

ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了&#xff1f; 3月4日周一&#xff0c;人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人&#xff0c;其中包括Opus、Sonnet和Haiku三种模型&#xff0c;该公司声称&#xff0c;这是迄今为止它们开发的最快速、最强…

Linux系统——SElinux

目录 前言 一、SELinux 的作用及权限管理机制 1.SELinux 的作用 1.1DAC 1.2MAC 1.3DAC 和 MAC 的对比 2.SELinux 基本概念 2.1主体&#xff08;Subject&#xff09; 2.2对象&#xff08;Object&#xff09; 2.3政策和规则&#xff08;Policy & Rule&#xff09;…

Nginx+Tomcat实现负载均衡动静分离

目录 一、背景与环境 1. 背景 2. 环境图示 3. 目标 二、操作过程 1. 第一层 2. 第二层 一、背景与环境 1. 背景 在一个Web应用程序中&#xff0c;通常会将动态内容&#xff08;由Tomcat处理&#xff09;与静态内容&#xff08;如图片、CSS、JavaScript文件等&#xff…

什么是5G边缘计算网关?

随着5G技术的飞速发展和普及&#xff0c;边缘计算作为5G时代的关键技术之一&#xff0c;正日益受到业界的关注。而5G边缘计算网关&#xff0c;作为连接5G网络和边缘计算节点的桥梁&#xff0c;扮演着至关重要的角色。HiWoo Box&#xff0c;作为一款卓越的5G边缘计算网关&#x…

springcloud:3.5测试慢调用熔断降级

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…

学习大数据,所必需的java基础(8)

文章目录 字符缓冲流字符缓冲输出流 _Buffered和Writer字符缓冲输入流字符缓冲流练习 转换流字符编码字符集转换流转换流_OutputStreamWriter序列流和反序列流的介绍序列化流_ObjectOutputStream反序列化_ObjectInputStream不想被序列化操作反序列化时出现的问题以及分析和解决…

解决:hive数据库初始失败

1、背景 采用Mysql数据库保存hive元数据时&#xff0c;我们一般是这样操作&#xff1a; 启动mysql服务&#xff1b;用mysql新建一个库&#xff08;比如库名为"hive“&#xff0c;这个“hive”与hive-site.xml中的local:3306/hive的“hive”对应&#xff0c;是用来保存hiv…

滴滴基于 Clickhouse 构建新一代日志存储系统

ClickHouse 是2016年开源的用于实时数据分析的一款高性能列式分布式数据库&#xff0c;支持向量化计算引擎、多核并行计算、高压缩比等功能&#xff0c;在分析型数据库中单表查询速度是最快的。2020年开始在滴滴内部大规模地推广和应用&#xff0c;服务网约车和日志检索等核心平…