HQYJ 3-18 整理

1.OSI七层体系结构:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

TCP/IP四层结构:网络接口层、网际层、传输层、应用层

五层结构:物理层、数据链路层、网络层、传输层、应用层

2.一帧数据的说明:大小为64-1518(包含以太网的头部14字节、尾部4字节),如果大于MTU最大传输单元,linux默认1500,需要分多次传输。

3.TCP/IP四层结构中常见的协议

应用层:HTTP,FTP(用于TCP传输),TFTP(用于UDP),SMTP

传输层:TCP,UDP

网络层:IP,ICMP,IGMP

链路层:ARP,RARP

4.TCP和UDP的异同

共同点:都是属于传输层的协议

不同点:

TCP:稳定;面向连接,可靠的数据传输服务;传输过程中,数据无误,数据无丢失,数据无失序,数据无重复(TCP会给每个数据包编上编号,该编号称之为序列号,每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止);数据传输效率低,耗费资源多;数据收发是不同步的(为了提高效率,TCP会把多个较小,并且发送间隔短的数据包沾成一个包发送,称为沾包现象);使用的场景是对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议,例如账号登陆和大型文件下载的时候;

UDP:快速;面向无连接的,不保证数据可靠,尽最大努力传输的协议;数据传输过程中,可能出现数据丢失、重复、失序等现象;数据传输效率高,实时性高;限制每次传输数据的大小,多出的部分直接忽略删除;收发是同步的,不会沾包;适用场景:发送尺寸较小的,在接收到数据给出应答比较困难的情况下;例如广播,通信软件的音视频。

5.系统提供了主机字节序和网络字节序的数据间相互转换的函数:hto

1> 将广播发送端和接收端各实现一遍

2> 将组播发送端和接收端各实现一遍

3> 将流式域套接字的服务器端和客户端各实现一遍

#include <myhead.h>
#define IP "192.168.117.255"
#define PORT 8888
//广播接收端
int main(int argc, const char *argv[])
{
	int rfd = -1;
	if((rfd = socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success\n");

	//2.绑定广播地址的IP和端口号
	struct sockaddr_in rin;
	rin.sin_family = AF_INET;
	rin.sin_port = htons(PORT);
	rin.sin_addr.s_addr = inet_addr(IP);

	if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");
//3.接收消息
	char rbuf[128] = "";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		recv(rfd,rbuf,sizeof(rbuf),0);
		printf("收到消息:%s\n",rbuf);
	}

	close(rfd);


	return 0;
}
#include <myhead.h>
#define PORT 8888
#define IP "192.168.117.255"

//广播发送端
int main(int argc, const char *argv[])
{
	//1.创建套接字
	int sfd = -1;
	if((sfd = socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success\n");
	//2.设置允许广播
	int broadcast = 1;
	if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-1)
	{
		perror("setsockopt error");
		return -1;
	}
	printf("setsockopt success\n");
	//3.绑定(可选)
	//4.填充接收端地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family = AF_INET;
	rin.sin_port = htons(PORT);
	rin.sin_addr.s_addr = inet_addr(IP);
	//5.发送消息
	char sbuf[128] = "";
	while(1)
	{
		printf("请输入>>>");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[sizeof(sbuf)-1]=0;
		sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&rin,sizeof(rin));
		printf("发送成功\n");
	}

	close(sfd);









	return 0;
}
#include <myhead.h>
#define PORT 8888
#define MILT_IP "224.1.2.3"
#define HOST_IP "192.168.117.2"
//组播接收端
int main(int argc, const char *argv[])
{
	//1.创建套接字
	int rfd = -1;
	if((rfd = socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success\n");
	//2.设置网络属性加入多播组
	struct ip_mreqn im;
	im.imr_multiaddr.s_addr = inet_addr(MILT_IP);
	im.imr_address.s_addr = inet_addr(HOST_IP);
	im.imr_ifindex = 2;
	//设置网络属性
	if(setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&im,sizeof(im))==-1)
	{
		perror("setscoket error");
		return -1;
	}
	printf("加入多播组成功\n");

	//3.绑定ip和端口号
	//3.1填写接收端地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family = AF_INET;
	rin.sin_port = htons(PORT);
	rin.sin_addr.s_addr = inet_addr(MILT_IP);
	//3.2绑定
	if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1)
	{
		perror("bind error");
		return -1;
	}
	//4.接收数据
	char rbuf[128] = "";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		recv(rfd,rbuf,sizeof(rbuf),0);
		printf("收到的消息为:%s\n",rbuf);
	}


	return 0;
}
#include <myhead.h>
#define PORT 8888
#define MILT_IP "224.1.2.3"

//组播发送端
//1.创建套接字
int main(int argc, const char *argv[])
{
	int sfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sfd == -1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success\n");

	//2.绑定ip和端口号(可选)
	//定义接收端地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family = AF_INET;
	rin.sin_port = htons(PORT);
	rin.sin_addr.s_addr = inet_addr(MILT_IP);

	char sbuf[128]="";
	while(1)
	{
		printf("请输入>>>");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]=0;
		sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&rin,sizeof(rin));
		printf("发射成功\n");

	}
	close(sfd);
	
	
	
	return 0;
}

 

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//流式域套接字服务器端
	int sfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(sfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success\n");
	//判断套接字是否存在
	if(access("./linux",F_OK)==0)
	{
		if(unlink("./linux")==-1)
		{
			perror("unlink error");
			return -1;
		}

	}
	//绑定套接字文件
	//2.1填充地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family = AF_UNIX;
	strcpy(sun.sun_path,"./linux");

	if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//3.启动被动监听
	if(listen(sfd,128)==-1)
	{
		perror("listen error");
		return -1;
	}

	//等待客户端连接请求
	//4.1定义地址信息结构体
	struct sockaddr_un cun;
	socklen_t socklen = sizeof(cun);

	int newfd = accept(sfd,(struct sockaddr*)&cun,&socklen);
	if(newfd ==-1)
	{
		perror("accept error");
		return -1;
	}
	//相互通信
	char rbuf[128] = "";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		int res=recv(newfd,rbuf,sizeof(rbuf)-1,0);
		if(res==0)
		{
			printf("客户端已下线\n");
			break;
		}
	
		printf("[%s]:%s\n",cun.sun_path,rbuf);
		strcat(rbuf,"^0^");
		send(newfd,rbuf,strlen(rbuf),0);
	}
	close(newfd);
	close(sfd);


	return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{
	//流式域套接字客户端
	int cfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(cfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success\n");
		//判断套接字是否存在
	if(access("./unix",F_OK)==0)
	{
		if(unlink("./unix")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}

	//2.1填充地址信息结构体
	struct sockaddr_un cun;
	cun.sun_family = AF_UNIX;
	strcpy(cun.sun_path,"./unix");

	if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	struct sockaddr_un sun;
	sun.sun_family = AF_UNIX;
	strcpy(sun.sun_path,"./linux");
	if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
		perror("connect error");
		return -1;
	}
	printf("连接成功\n");

		//相互通信
	char wbuf[128] = "";
    while(1)
    {
        printf("请输入>>>");
        fgets(wbuf, sizeof(wbuf), stdin);    //从终端上获取一个字符串
        wbuf[strlen(wbuf)-1] = '\0';      //将换行换成 '\0'

        //判断输入的字符串值
        if(strcmp(wbuf, "quit") ==0)
        {
            break;
        }

        //将数据发送给服务器
        send(cfd, wbuf, strlen(wbuf), 0);

        //将字符数组清空
        bzero(wbuf, sizeof(wbuf));
        recv(cfd, wbuf, sizeof(wbuf)-1, 0);
        printf("收到服务器消息为:%s\n", wbuf);
    }
    
    //5、关闭套接字
    close(cfd);

    return 0;
}

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决访问站外图片403(referrer)问题

问题 我们在使用站外图片的时候&#xff0c;访问图片403&#xff0c;但是浏览器直接访问图片链接可以打开&#xff0c;这是为什么呢&#xff1f; 原因 http请求体的header中有一个referrer字段&#xff0c;用来表示发起http请求的源地址信息&#xff0c;这个referrer信息是可…

WPS制作甘特图

“ 甘特图&#xff08;Gantt chart&#xff09;又称为横道图、条状图&#xff08;Bar chart&#xff09;&#xff0c;通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。” 设置基础样式 设置行高 设置宽度 准备基础数据 计算持续时间 …

解决Android Studio Flamingo创建项目时出现的问题

问题1 使用Android Studio Flamingo创建项目时&#xff0c;IDE默认下载Gradle 8.0&#xff0c;但是下载速度特别慢&#xff0c;或者直接下载失败 解决办法-手动安装Gradle 第一步&#xff1a;使用浏览器下载gradle-8.0-bin.zip 下载地址&#xff1a;https://services.gradle…

Flutter-Android studio常用快捷键总结

前言 因为之前一直用Xcode&#xff0c;对Android studio的快捷键还不是很熟悉&#xff0c;这次有空来总结一下。 一、快捷键 1、Ctrl option O 删除未使用的 import 这个快捷键其实也不需要&#xff0c;可以在设置里面设置flutter自动格式化代码&#xff0c;或者使用CMD …

Servlet两种配置

通过xml配置 <servlet><servlet-name>MyServlet</servlet-name><servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/MyServlet</ur…

智慧城市中的智慧生活:便捷、舒适与高效

目录 一、智慧城市中的智慧生活概述 二、智慧生活带来的便捷性 1、智慧交通的便捷出行 2、智慧购物的轻松体验 3、智慧政务的一站式服务 三、智慧生活带来的舒适性 1、智慧环境的绿色宜居 2、智慧医疗的健康保障 3、智慧教育的均衡发展 四、智慧生活带来的高效性 1、…

Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的Blueprints&#xff1a;模块化和组织大型Web应用 在构建大型Web应用时&#xff0…

机器人可反向驱动能力与力控架构

反向驱动性是电机传动系统的机械特性&#xff0c;它描述了运动是否可以轻松反转 。特别是&#xff0c;反向驱动能力取决于两个因素&#xff1a;传动运动效率和整体执行器机械阻抗。反向运动中传动装置的低运动效率意味着所施加的外力的大部分被运动反作用力抵消。然而&#xff…

海外问卷调查:代理IP使用方法

在进行问卷调查时&#xff0c;为了避免被限制访问或被封禁IP&#xff0c;使用代理IP已经成为了必要的选择。 其中&#xff0c;口子查和渠道查也不例外。 使用代理IP可以隐藏本机IP地址&#xff0c;模拟不同的IP地址&#xff0c;从而规避被封禁的风险。但是&#xff0c;对于很…

layuiAdmin-通用型后台模板框架【广泛用于各类管理平台】

1. 主页 1.1 控制台 2. 组件 3. 页面 3.1 个人主页 3.2 通讯录 3.3 客户列表 3.4 商品列表 3.5 留言板 3.6 搜索结果 3.7 注册 3.8 登入 3.9 忘记密码 4. 应用 4.1 内容系统 4.1.1 文章列表 4.1.2 分类管理 4.1.3 评论管理 4.2 社区系统 4.2.1 帖子列表 4.2.2 回…

【FPGA/IC】什么是模块化设计?

什么是模块化设计 FPGA/IC设计中根据模块层次的不同有两种基本的设计方法&#xff1a; 自下而上方法对设计进行逐次划分的过程是从基本单元出发的&#xff0c;设计树最末枝上的单元是已经设计好的基本单元&#xff0c;或者其他项目开发好的单元或者IP。该方法先对底层的功能块…

数据结构:图的拓扑排序与关键路径

目录 一、拓扑排序 1.1、算法的基本步骤 1.2、算法实现 1.4、习题思考 1.5、DFS生成逆拓扑序 一、拓扑排序 AOV网:在 有向图中&#xff0c; 顶点表示活动&#xff08;或任务&#xff09;&#xff0c; 有向边表示活动&#xff08;或任务&#xff09;间的先后关系&#xff0…

在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像

构建 SyterKit 作为 Bootloader SyterKit 是一个纯裸机框架&#xff0c;用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板&#xff0c;SyterKit 使用 CMake 作为构建系统构建&#xff0c;支持多种应用与多种外设驱动。同时 SyterKit 也具有启动引导的功能&a…

Kotlin: 协程的四种启动模式(CoroutineStart)

点击查看CoroutineStart英文文档 创建协程的三种方式 runBlocking 运行一个协程并且会阻塞当前线程&#xff0c;直到它完成。launch 启动一个新的协程&#xff0c;不会阻塞当前线程&#xff0c;并且返回一个Job&#xff0c;可以取消。async async和await是两个函数&#xff0c…

【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

目录 0 引言1 快速入门1.1 新建插件的前提1.2 创建插件步骤1.3 打包插件 2 无源代码的插件制作3 插件详细介绍3.1 插件的使用方法3.1 UE 预置插件模版3.1.1 空白3.1.2 纯内容3.1.3 编辑器独立窗口3.1.4 编辑器工具栏按钮3.1.5 编辑器模式3.1.6 第三方库3.1.7 蓝图库 3.2 插件中…

【视频异常检测】Delving into CLIP latent space for Video Anomaly Recognition 论文阅读

Delving into CLIP latent space for Video Anomaly Recognition 论文阅读 ABSTRACT1. Introduction2. Related Works3. Proposed approach3.1. Selector model3.2. Temporal Model3.3. Predictions Aggregation3.4. Training 4. Experiments4.1. Experiment Setup4.2. Evaluat…

Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Language Models are Unsupervised Multitask Learners 论文下载地址&#xff1a;https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learner…

jar读取目录配置、打包jar后无法获取目录下的配置

jar读取目录配置、打包jar后无法获取目录下的配置 jar读取目录配置、打包jar后无法获取目录下的配置。java打成jar包后获取不到配置文件路径。解决项目打成jar包上线无法读取配置文件。打包jar后无法读取resource下的配置文件 场景 需要读取 src/main/resources/mapper下的所…

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式&#xff1a; 序列号&#xff1a;通过SYN传给接收端&#xff0c;当SYN为1&#xff0c;表示请求建立连接&#xff0c;且设置序列号初值&#xff0c;后面没法送一次数据&#xff0c;就累加数据大小&#xff0c;保证包有序。 确认应答号&#x…

算法——贪心算法

《算法图解》——贪心算法 # 首先创建一个表&#xff0c;包含所覆盖的州 states_needed set([mt,wa,or,id,nv,ut,az]) # 传入一个数组&#xff0c;转换成一个集合#可供选择的广播台清单 stations {} stations[kone] set([id,nv,ut]) #用集合表示想要覆盖的州&#xff0c;且不…