TCP/UDP模型:2024/2/29

作业1:TCP模型

服务器端:

#include <myhead.h>
#define SER_IP "192.168.199.129"
#define SER_PORT 8899

int main(int argc, const char *argv[])
{
	//1.创建用于连接的套接字文件
	int sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd==-1){
		perror("socket error");
		return -1;
	}
	//2.绑定端口号和IP地址
	//填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);

	if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1){
		perror("bind error");
		return -1;
	}
	printf("bind success\n");
	//3.启动监听
	if(listen(sfd,128)==-1){
		perror("listen error");
		return -1;
	}
	printf("listen success\n");
	//4.接受请求
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);

	//接收请求后创建用于通信的套接字
	int newfd=accept(sfd,(struct sockaddr *)&cin,&socklen);
	if(newfd==-1){
		perror("accept error");
		return -1;
	}

	printf("newfd=%d 您有新的客户端已上线\n",newfd);
	//5.数据收发
	char sbuf[128]="";
	while(1)
	{
		//清空数组
		bzero(sbuf,sizeof(sbuf));

		//接收客户端发来的消息
		int res=recv(newfd,sbuf,sizeof(sbuf),0);
		if(res==0){
			break;
		}
		//回复客户端发来的消息
		strcat(sbuf," !!!");
		send(newfd,sbuf,strlen(sbuf),0);

	}
	//6.关闭套接字文件
	close(newfd);
	close(sfd);

	return 0;
}

客户端:

#include <myhead.h>
#define SER_IP "192.168.199.129"
#define SER_PORT 8899

int main(int argc, const char *argv[])
{
	//1.创建用于通信的套接字
	int cfd=socket(AF_INET,SOCK_STREAM,0);
	if(cfd==-1){
		perror("socket error");
		return -1;
	}
	//2.连接服务器
	//填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORT);
	sin.sin_addr.s_addr=inet_addr(SER_IP);

	//发出连接请求
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
		perror("connect error");
		return -1;
	}
	//3.进行数据的收发
	char wbuf[128]="";
	while(1)
	{
		//清空数组
		bzero(wbuf,sizeof(wbuf));

		//从终端写入数据
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]='\0';

		//将数据发送到服务端
		send(cfd,wbuf,strlen(wbuf),0);
		printf("发送成功\n");

		if(strcmp(wbuf,"quit")==0){
			break;
		}

		//接收服务端发送来的消息
		
		//清空数组
		bzero(wbuf,sizeof(wbuf));

		recv(cfd,wbuf,sizeof(wbuf),0);
		printf("接收到的数据为:%s\n",wbuf);
	}
	//4.关闭套接字
	close(cfd);
	return 0;
}

效果图:

作业2:UDP模型

服务器端:

#include <myhead.h>
#define SER_IP "192.168.199.129"
#define SER_PORT 9988
int main(int argc, const char *argv[])
{
	//1.创建用于通信的套接字
	int sfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sfd==-1){
		perror("socket error");
		return -1;
	}
	printf("socket success\n");

	//2.绑定端口号
	
	//填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORT);
	sin.sin_addr.s_addr=inet_addr(SER_IP);

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

	//3.进行数据收发
	//定义客户端地址信息结构体
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
	char rbuf[128]="";
	while(1)
	{
		//清空数组
		bzero(rbuf,sizeof(rbuf));

		//读取客户端信息
		recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&socklen);
		printf("收到的消息为:%s\n",rbuf);

		if(strcmp(rbuf,"quit")==0){
			break;
		}
		
		//向客户端回复消息
		strcat(rbuf," !!!");
		sendto(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,socklen);

	}
	//4.关闭套接字
	close(sfd);
	return 0;
}

客户端:

#include <myhead.h>
#define SER_IP "192.168.199.129"
#define SER_PORT 9988
int main(int argc, const char *argv[])
{
	//1.创建用于通信的套接字
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd==-1){
		perror("socket error");
		return -1;
	}
	//数据收发
	
	char wbuf[128]="";
	//填充地址信息结构体
	struct sockaddr_in sin;
	socklen_t socklen=sizeof(sin);
    sin.sin_family=AF_INET;
    sin.sin_port=htons(SER_PORT);
    sin.sin_addr.s_addr=inet_addr(SER_IP);
	while(1)
	{
		//清空数组
		bzero(wbuf,sizeof(wbuf));

		//从终端获取数据
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]='\0';

		//将数据发送到服务端
		sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&sin,socklen);
		printf("发送成功\n");
		if(strcmp(wbuf,"quit")==0){
			break;
		}
		//接收从服务端回复的消息
		recvfrom(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&sin,&socklen);
		printf("接收到的消息为:%s\n",wbuf);
	}
	//关闭套接字
	close(cfd);
	return 0;
}

效果图:

作业3:思维导图

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

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

相关文章

5 分钟配置好 Electron 应用的图标

最近在开发博客本地客户端 HexoPress&#xff0c;应用做好后&#xff0c;需要打包&#xff0c;如果不希望打包出来 App 的图标用的是 Electron 默认的星球环绕的图标&#xff0c;那么需要自己制作图标。 制作图标 首先&#xff0c;你需要给各种操作系统制作一个满足要求的图标…

hcip--VLAN实验

一&#xff1a;实验要求 二&#xff1a; 实验分析 1.pc1和pc3在同一个vlan&#xff08;vlan2&#xff09;&#xff0c;因为是access接口模式&#xff0c;那么需和pc2/4/5/6不在同一个网 段&#xff0c;则是做路由器的子接口。 2. pc2/4/5/6在同一个网段&#xff0c;且需要实…

Java+SpringBoot,打造社区疫情信息新生态

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

FPGA-DDS原理及实现

DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域。 相位累加器是由N位加法器与N位寄存器构成,每个时钟周期的上升沿,加法器…

公司电脑ip所在地查询方法参考

公司局域网 可以看到这种方法查不出来 直接百度 直接被智能云识别了出来 询问gpt的方法 获得ipv6 curl ifconfig.me 但是ipv6好像对我们并没有多大帮助

自动化构建平台(三)Linux搭建私有的docker镜像库之Harbor的安装和使用详解

文章目录 前言一、Harbor的安装第一步&#xff1a;安装docker第二步&#xff1a;安装docker-compose第三步&#xff1a;安装Harbor 二、Harbor登录三、Harbor项目管理第一步&#xff1a;创建项目第二步&#xff1a;推送镜像 四、Harbor权限控制五、Harbor自动清理多余的镜像手动…

广汽埃安工厂:蔚来汽车的造车工厂有哪些?

具体来说&#xff0c;理想汽车目前在常州仅有一家汽车制造工厂。 一期项目于2017年12月竣工&#xff0c;2019年12月投产&#xff0c;年产能10万辆/年。 同时&#xff0c;正在规划二期工程。 产能将增至20万辆/年。 此外&#xff0c;理想还计划接管现代汽车在北京顺义的第一家工…

Xcode :Could not build module ‘WebKit‘ 已验证解决

问题&#xff1a;Could not build module WebKit 具体报错如下&#xff1a; error: type argument nw_proxy_config_t (aka struct nw_proxy_config *) is neither an Objective-C object nor a block type property (nullable, nonatomic, copy) NSArray<nw_proxy_config_…

Qt 中Qwidget相关属性

文章目录 1. QWidget 核心属性1.1 enabled1.2 geometry1.2.1 window frame 的影响 1.3 windowTitle1.4 windowIcon1.4.1 qrc的使用 1.5 windowOpacity1.6 cursor1.7 focusPolicy1.8 styleSheet 1. QWidget 核心属性 在 Qt 中, 使⽤ QWidget 类表⽰ “控件”. 像按钮, 视图, 输…

Vue3自定义文章列表组件

一、Vue3的代码展示 <template><div><div v-for"article in articles" :key"article.id" class"article-card"><div class"author-info"><img :src"article.avatar" alt"Author Avatar&qu…

Vue+SpringBoot打造海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

房贷计算器微信小程序原生语言

微信小程序: 房贷计算器 效果: 输入 300万 结果 还款明细 一共有3个页面 1、输入页面 2、结果页面 3、详情页面 1 index页面 index.wxml文件 <view class="text-black"><!--房屋总价--><view class="cu-bar bg-white solid-bottom"&…

计算机二级MySQL-错题、知识点合集02

计算机二级数据库 第2章 MySQL数据库基础 在SQL语言按功能的分类中&#xff0c;包括DDL、DML、DCL。数据定义语言&#xff08;DDL&#xff09;对各种数据库对象&#xff08;非数据&#xff09;进行创建、删除、修改&#xff1b;数据操纵语言&#xff08;DML&#xff09;对各种数…

源码的角度分析Vue2数据双向绑定原理

什么是双向绑定 我们先从单向绑定切入&#xff0c;其实单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新。那么双向绑定就可以从此联想到&#xff0c;即在单向绑定的基础上&#xff0c;用户更新…

压缩视频大小的软件有哪些?5款软件推荐

压缩视频大小的软件有哪些&#xff1f;随着高清摄像设备的普及和网络速度的不断提升&#xff0c;视频文件变得越来越庞大&#xff0c;动辄数百兆甚至数GB的大小常常让用户在分享和存储时感到头疼。幸运的是&#xff0c;市面上有许多优秀的视频压缩软件可以帮助我们轻松应对这一…

CDH6.3.1离线安装

一、从官方文档整体认识CDH 官方文档地址如下&#xff1a; CDH Overview | 6.3.x | Cloudera Documentation CDH是Apache Hadoop和相关项目中最完整、测试最全面、最受欢迎的发行版。CDH提供Hadoop的核心元素、可扩展存储和分布式计算&#xff0c;以及基于Web的用户界面和重…

使用docker方式测试部署django项目(客户催)

需求 1&#xff1a;已有django项目–weidanyewu 2&#xff1a;希望在服务器上测试部署–客户催 3&#xff1a;没完善django的启动 4&#xff1a;使用临时数据库进行演示 5&#xff1a;使用python3.10版本镜像 6&#xff1a;展示端口80 7&#xff1a;后台执行django程序 8&#…

js 面试 sort背后原理及排序使用方法

1 sort 概念 2 原理 之前版本是用的插入排序 和 快速排序。 现在用的是冒泡排序。 3 排序方式&#xff1a; 2-1 根据字符码点排序 2-2 从小到大或从大到小排序 2-3 对数组中的对象进行排序

android开发技术论文,Android中为什么需要Handler

前言 马爸爸总结了一句话&#xff1a;跳槽&#xff0c;要么是钱不到位&#xff0c;要么是受了委屈。 我给自己这次的跳槽经历做了一个分析&#xff0c;希望能对那些想换工作的朋友有所帮助。 许多朋友想换工作&#xff0c;但是对“换工作”的理解可能仅限于写简历、投简历、…

“智农”-数字乡村可视化

“智农”打造数字乡村可视化&#xff0c;结合乡村区域实际情况&#xff0c;以规划完善乡村机制体系和更好服务乡村振兴为目标&#xff0c;坚持可持续、可复制、可扩展的建设原则&#xff0c;着力解决农村信息孤岛&#xff0c;提高农村种植技术&#xff0c;加快农村信息化和产业…