网络编程 24/3/4 作业

1、广播

发送端

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字
	int sfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sfd==-1)
	{
		perror("socket error");
		return -1;
	}
	//设置当前套接字允许广播属性
	int broadcast=1;
	if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-1)
	{
		perror("setsockeopt error");
		return -1;
	}
	//绑定(可选)
	
	//填充接收端地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(8888);
	sin.sin_addr.s_addr=inet_addr("192.168.1.255");

	//发送数据
	char sbuf[128]="";
	while(1)
	{
		printf("please enter:");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]=0;
		sendto(sfd,sbuf,strlen(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("send success\n");
	}
	//关闭
	close(sfd);
	return 0;
}

接收端

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字
	int rfd=socket(AF_INET,SOCK_DGRAM,0);
	if(rfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("rfd=%d\n",rfd);
	//填充地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family=AF_INET;
	rin.sin_port=htons(8888);
	rin.sin_addr.s_addr=inet_addr("192.168.1.255");
	//绑定
	if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1)
	{
		perror("bind error");
		return -1;
	}
	//接收广播消息
	char rbuf[128]="";
	while(1)
	{
		//清空内容
		bzero(rbuf,sizeof(rbuf));
		//读取消息
		recv(rfd,rbuf,sizeof(rbuf),0);
		printf("u recv:%s\n",rbuf);
	}
	//关闭套接字
	close(rfd);
	return 0;
}

 

2、组播

发送端

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字
	int rfd=socket(AF_INET,SOCK_DGRAM,0);
	if(rfd==-1)
	{
		perror("socket error");
		return -1;
	}

	//绑定端口号和ip地址
	//填充地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family=AF_INET;
	rin.sin_port=htons(7890);
	rin.sin_addr.s_addr=inet_addr("192.168.1.7");
	
	if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1)
	{
		perror("bind error");
		return -1;
	}
	
	//发送消息
	//填充接收端地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(8888);
	sin.sin_addr.s_addr=inet_addr("224.1.2.3");
	
	char sbuf[128]="";
	while(1)
	{
		printf("please enter:");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]=0;
		//向组播地址发送消息
		sendto(rfd,sbuf,strlen(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("send success\n");
	}
	//关闭
	close(rfd);
	return 0;
}

接收端

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字
	int rfd=socket(AF_INET,SOCK_DGRAM,0);
	if(rfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("rfd=%d\n",rfd);

	//设置加入多播组
	struct ip_mreqn imr;
	imr.imr_multiaddr.s_addr=inet_addr("224.1.2.3");//组播ip
	imr.imr_address.s_addr=inet_addr("192.168.1.7");//本地ip
	imr.imr_ifindex=2;//网卡编号

	if(setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&imr,sizeof(imr))==-1)
	{
		perror("setsockopt error");
		return -1;
	}

	//填充地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family=AF_INET;
	rin.sin_port=htons(8888);
	rin.sin_addr.s_addr=inet_addr("224.1.2.3");//组播地址
	//绑定
	if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1)
	{
		perror("bind error");
		return -1;
	}
	//接收组播消息
	char rbuf[128]="";
	while(1)
	{
		//清空内容
		bzero(rbuf,sizeof(rbuf));
		//读取消息
		recv(rfd,rbuf,sizeof(rbuf),0);
		printf("u recv:%s\n",rbuf);
	}
	//关闭套接字
	close(rfd);
	return 0;
}

3、流式域套接字

发送端

#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;
	}
	//判断套接字文件是否存在,存在则删除
	if(access("./mysocket",F_OK)==0)
	{
		//文件存在,删除
		if(unlink("./mysocket")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}
	//绑定套接字文件
	//填充地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;//地址族
	strcpy(sun.sun_path,"./mysocket");//套接字文件

	//绑定
	if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");
	//监听
	if(listen(sfd,128)==-1)
	{
		perror("listen error");
		return -1;
	}
	printf("listen success\n");
	//阻塞等待客户端连接请求
	//定义容器接收客户端地址信息
	struct sockaddr_un cun;
	socklen_t socklen=sizeof(cun);
	int newfd=-1;
	if((newfd=accept(sfd,(struct sockaddr*)&cun,&socklen))==-1)
	{
		perror("accept error");
		return -1;
	}
	printf("新用户发来连线请求\n");
	//数据收发
	char rbuf[128]="";
	while(1)
	{
		//清空
		bzero(rbuf,sizeof(rbuf));
		//收取数据
		recv(newfd,rbuf,sizeof(rbuf),0);
		printf("[%s]:%s\n",cun.sun_path,rbuf);
		//回复
		strcat(rbuf,"  OvO");
		send(newfd,rbuf,strlen(rbuf),0);
		printf("send success\n");
	}
	//关闭套接字文件
	close(sfd);
	close(newfd);
	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("cfd=%d\n",cfd);
	//判断套接字文件是否存在,存在则删除
	if(access("./mysocket1",F_OK)==0)
	{
		//说明存在,删除该文件
		if(unlink("./mysocket1")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}
	//绑定(非必须)
	//填充地址信息结构体
	struct sockaddr_un cun;
	cun.sun_family=AF_UNIX;
	strcpy(cun.sun_path,"./mysocket1");
	//绑定
	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,"./mysocket1");

	//连接服务器
	if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
		perror("connect error");
		return -1;
	}
	printf("connect success\n");
	//数据收发
	char wbuf[128]="";
	while(1)
	{
		//清空数据
		bzero(wbuf,sizeof(wbuf));
		printf("please enter:");
		fgets(wbuf,sizeof(wbuf),stdin);//终端输入
		wbuf[strlen(wbuf)-1]=0;
		//将数据发给服务器
		send(cfd,wbuf,strlen(wbuf),0);
		printf("send success\n");
		//判断发生的数据
		if(strcmp(wbuf,"quit")==0)
		{
			break;
		}
		//接收服务器发来的数据
		//清空数据
		bzero(wbuf,sizeof(wbuf));
		recv(cfd,wbuf,sizeof(wbuf),0);
		printf("u recv:%s\n",wbuf);
	}
	//关闭套接字
	close(cfd);
	return 0;
}

4、报式域套接字

发送端

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字
	int sfd=socket(AF_UNIX,SOCK_DGRAM,0);
	if(sfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("sfd=%d\n",sfd);
	//判断套接字文件是否存在,存在需删除
	if(access("./linux1",F_OK)==0)
	{
		if(unlink("./linux1")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}
	//绑定ip和端口号
	//填充地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;//地址族
	strcpy(sun.sun_path,"./linux1");
	//绑定
	if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");
	//收发数据
	char rbuf[128]="";
	//定义容器接收对端地址信息结构体
	struct sockaddr_un cun;
	socklen_t socklen=sizeof(cun);

	while(1)
	{
		//清空数组
		bzero(rbuf,sizeof(rbuf));
		//接收数据
		recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cun,&socklen);
		printf("u recv:%s\n",rbuf);
		//回复
		strcat(rbuf,"  OvO");
		if(sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cun,socklen)==-1)
		{
			perror("sendto error");
			return -1;
		}
	}
	//关闭套接字
	close(sfd);
	return 0;
}

接收端

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字
	int cfd=socket(AF_UNIX,SOCK_DGRAM,0);
	if(cfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("cfd=%d\n",cfd);

	//判断套接字文件是否存在,存在需删除
	if(access("./linux2",F_OK)==0)
	{
		if(unlink("./unix2")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}
	//绑定ip地址和端口号
	struct sockaddr_un cun;
	cun.sun_family=AF_UNIX;
	strcpy(cun.sun_path,"./linux2");
	if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1)
	{
		perror("bind error");
		return -1;
	}
	//收发数据
	char wbuf[128]="";
	//定义容器,记录服务器的地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;
	strcpy(sun.sun_path,"./linux1");
	while(1)
	{
		//清空数组
		bzero(wbuf,sizeof(wbuf));
		//从终端获取数据
		printf("please enter:");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		//将数据发给服务器
		sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&sun,sizeof(sun));
		printf("send success\n");
		//接收回复的消息
		bzero(wbuf,sizeof(wbuf));
		recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);
		printf("u recv:%s\n",wbuf);
	}
	//关闭套接字文件
	close(cfd);
	return 0;
}

5、思维导图

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

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

相关文章

numpy数据操作

numpy数据操作 读取数据 # numpy读取数据np.loadtxt(fname, 文件、字符串或产生器, 也可以是压缩文件dtypenp.float, 数据类型, 可选, 即确认csv的字符串以什么数据类型读入数组中, 默认为np.floatdelimiterNone, 分割读取的字符串, 默认是…

基于灰狼算法GWO的城市三维无人机路径规划(复杂地形三维航迹路径规划)

摘要 本文提出了一种利用灰狼算法GWO来解决城市环境下无人机三维路径规划问题的方法。这种方法将复杂的无人机航迹规划任务转化为一个优化问题&#xff0c;然后运用灰狼算法GWO来解决这个优化问题。灰狼算法GWO是一种模拟灰狼种群捕猎行为的优化算法&#xff0c;它具备强大的全…

基于springboot+vue实现校企合作项目管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校企合作项目管理系统演示 摘要 这是一个计算机的时代&#xff0c;在计算机应用非常广泛的时代中&#xff0c;用计算机来完成对信息的处理有着非常好的使用效果。特别是针对学校而言亦是如此&#xff0c;通过在学校中的信息化建设&#xff0c;能够很好的提升…

win11环境下使用hane WIN NFS Server搭建nfs服务

如题&#xff0c;服务端使用hane win nfs server&#xff0c;客户端也是使用wins系统。 S1&#xff0c;安装nfs服务器端&#xff0c;wins系列除了server系列可以使用nfs服务端&#xff0c;其余必须使用额外的组件来实现NFS文件系统的功能。 Networking Software for Windows …

【WPS】Excel查重数据对比

数据对比 数据对比标记重复数据查询过滤处理

STL容器之map和set的补充AVL树

一、AVL树 ​ 不同搜索的对比&#xff1a;1.暴力搜索时间复杂度是O(N)&#xff1b;2.二分查找的时间复杂度是O(lgN)&#xff0c;但是伴随着有序&#xff0c;插入删除挪动数据的成本极高&#xff1b;3.二叉搜索的时间复杂度是高度次数&#xff0c;极端场景会退化为类似链表时间…

栈和队列之队列

1.队列 1.1队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队…

android开发框架mvp,Android面试心得必备技能储备详解

面试复习路线图 我之前复习&#xff0c;大多都在20点以后&#xff0c;因为晚上比较能集中注意力&#xff0c;制定一个学习计划&#xff0c;切勿零散的复习&#xff0c;最好是系统的复习&#xff0c;才能胜却在握 主要内容如下&#xff1a; BAT的面试题目相关性能优化相关相关…

日本极致产品力|与日本所有食物百搭,年销量2亿箱的啤酒品牌

摘要&#xff1a;《极致产品力》日本深度研学,可以帮助企业找产品、找方向、找方法,在日本终端市场考察中洞悉热销产品背后的成功逻辑,了解最新最前沿的产品趋势和机会。结合日本消费趋势中国转化的众多经验,从品牌、包装、卖点、技术和生产工艺等多方面寻找中口市场的解决方案…

Echarts+D3气泡图

EchartsD3气泡图&#xff08;相邻效果&#xff0c;气泡之间不叠加&#xff09; <template><div ref"chart" style"width: 500px; height: 500px"></div> </template><script setup> import * as echarts from echarts/core …

准确率达 91.74%!东南大学提出光伏电池缺陷检测模型,首次引入神经结构搜索

乘着从全球吹来的「绿色发展、低碳转型」东风&#xff0c;光伏 (photovoltaic, PV) 产业自进入 21 世纪以来&#xff0c;便以令世人惊叹的速度迅猛向前发展。在我国&#xff0c;光伏发电更是呈现出前所未有的活力。根据 2023 年 4 月国家能源局公布的当年 1-3 月份全国电力工业…

【IO】进程间通信

A程序代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <string.h> int main(int argc, const char *argv[]) {if(mkfifo…

Redis缓存【重点】

参考链接 https://xiaolincoding.com/redis/cluster/cache_problem.html#%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9 目录 缓存雪崩大量数据同时过期Redis 故障宕机 缓存击穿第一种方案&#xff0c;非法请求的限制第二种方案&#xff0c;缓存空值或者默认值第三种方案&#xff0c;使…

Docker中使用nginx-rtmp推拉网络摄像头视频流

前言&#xff1a; 该部分比较麻烦&#xff0c;闹腾了好久&#xff08;ffmpeg推拉流没学过&#xff0c;事实证明依葫芦画瓢是不行滴&#xff0c;后面有时间再学吧&#xff09;&#xff0c;后来借助chatGPT勉强解决&#xff0c;但不是很懂。因个人能力有限&#xff0c;只复述操作…

合泰HT66F2390----定时器中断学习笔记

前言 无需多言 直接开始定时器中断 的学习 通过上次的PWM学习&#xff0c;上次用的是周期型TM定时器模块 这次使用标准型TM定时器模块&#xff08;STM&#xff09; 代码 #include <HT66F2390.h>void Timer0_Init(void){_stm0c0 0b00001000;_stm0c1 0b11000001;_stm…

Vmware虚拟机安装openEuler 20.03 LTS(openEuler20.03)

文章目录 vmware虚拟机安装openEuler 20.03 LTS安装硬件设备&#xff08;略&#xff09;安装OS镜像下载镜像版本发布说明开始安装&#xff08;vmware虚拟机&#xff09;安装操作系统必要操作关闭防火墙设置selinux为宽容模式系统内核问题禁用系统内核更新 ~~禁用yum update和dn…

Ubuntu18.04运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18) 文章目录 ORB-SLAM3复现(ubuntu18)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calibration…

构造pop链

反序列化视频笔记 第一步&#xff1a;找到目标触发echo调用$flag 第二步&#xff1a;触发_invoke函数调用appeng函数$varflag.php&#xff08;把对象当成函数&#xff09; 第三步&#xff1a;给$p赋值为对象&#xff0c;即function成为对象Modifier却被当成函数调用&#xff…

基于springboot+vue的校园网上店铺

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Android开发者必看,我的移动开发春季历程

热修复介绍 1.开发流程 当项目出现紧急bug时&#xff0c;传统的开发流程是发布新版本&#xff0c;引导用户覆盖安装。抛开平台审核上线的时间不说&#xff0c;一天重复下载安装至少两次的用户体验是很差的。而热修复的出现完美解决了这个问题&#xff0c;用户在收到服务器推送…