网络进程:广播、组播、流式域、报式域(套接字)

news2024/11/24 1:59:11

1.广播

1.1广播发送端模型(类似UDP客户端)

程序代码:

#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)
		//套接字描述符,套接字要设置的层(应用层)、指定层内属性(允许广播)
		//设置该属性容器起始地址,参数4的大小
	{
		perror("setsockopt error");
		return -1;
	}
	//绑定,非必要
	//填充接收端地址信息结构体
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(6789);
	cin.sin_addr.s_addr=inet_addr("192.168.125.255");
	//发送消息
	char sbuf[128]="";
	while(1)
	{
		printf("请输入>>>");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]=0;
		//发送到广播地址
		sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&cin,sizeof(cin));
		printf("发送成功\n");
	}
	//关闭套接字
	close(sfd);
	return 0;
}

1.2广播接收端模型(类似UDP服务器端)

程序代码:

#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;
	}
	//填充地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family=AF_INET;
	rin.sin_port=htons(6789);
	rin.sin_addr.s_addr=inet_addr("192.168.125.255");
	//绑定
	if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1)
	{
		perror("bind error");
		return -1;
	}
	//接收信息
	char rbuf[128]="";
	while(1)
	{
		//清空数组
		bzero(rbuf,sizeof(rbuf));
		//接受信息
		recvfrom(rfd,rbuf,sizeof(rbuf),0,0,0);
		printf("收到消息:%s\n",rbuf);
	}
	//关闭套接字
	close(rfd);
	return 0;
}

运行结果:

2. 组播

2.1组播发送端模型(类型UDP客户端)

程序代码:

#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;
	}
	//绑定非必要
	//填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(9999);
	sin.sin_addr.s_addr=inet_addr("224.1.2.3");
	//发送消息
	char sbuf[128]="";
	while(1)
	{
		printf("请输入>>>");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]=0;
		sendto(rfd,sbuf,strlen(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("发送成功\n");
	}
	close(rfd);
	return 0;
}

2.2组播接收端模型(类似UDP服务器端)

程序代码:

#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");
	imr.imr_address.s_addr=inet_addr("192.168.125.227");
	imr.imr_ifindex=2;//网卡编号
	if(setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&imr,sizeof(imr))==-1)
	{
		perror("setsockopt error");
		return -1;
	}
	printf("加入组播成功\n");
	//填充地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family=AF_INET;
	rin.sin_port=htons(9999);
	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("收到:%s\n",rbuf);
	}
	close(rfd);
	return 0;
}

运行结果:

3.流式域套接字

3.1流式域套接字服务器端

程序代码:

#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;
		}
	}
	//2.绑定套接字文件
	//2.1填充地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;
	//字符串不能用赋值运算符赋值
	strcpy(sun.sun_path,"./mysocket");
	//2.2绑定
	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;
	}
	printf("listen success\n");
	//4.阻塞等待客户端连接请求
	//定义容器接收客户端地址信息
	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");
	//5.数据收发
	char rbuf[128]="";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		int res=recv(newfd,rbuf,sizeof(rbuf),0);
		if(res==0)
		{
			printf("客户端已下线\n");
			break;
		}
		printf("[%s]:%s\n",cun.sun_path,rbuf);
		//连接一个笑脸回复
		strcat(rbuf,"*_*");
		//发送回去
		send(newfd,rbuf,strlen(rbuf),0);
		printf("发送成功\n");
	}
	close(sfd);
	close(newfd);
	return 0;
}

3.2流式域套接字客户端

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//1.创建用于通信的套接字文件描述符
	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;
		}
	}
	//2.绑定(不绑定,系统不会绑定)
	//2.1填充地址信息结构体
	struct sockaddr_un cun;
	cun.sun_family=AF_UNIX;
	strcpy(cun.sun_path,"./mysocket1");
	//2.2绑定
	if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");
	//3.连接服务器
	//3.1填充要连接的服务器地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;
	strcpy(sun.sun_path,"./mysocket");
	//3.2连接服务器
	if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
		perror("connect error");
		return -1;
	}
	printf("connect success\n");
	//4.数据收发
	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);
	}
	close(cfd);
	return 0;
}

运行结果:

4.报式域套接字

4.1报式域套接字服务器端

程序代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字
	int sfd=socket(AF_UNIX,SOCK_DGRAM,0);
	//SOCK_DGRAM使用UDP报式套接字通信
	if(sfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("sfd=%d\n",sfd);
	//域套接字绑定函数,只能绑定一个不存在的套接字文件
	//绑定前判断当前文件是否存在
	if(access("./linux",F_OK)==0)
	{
		//文件存在删除
		if(unlink("./linux")==-1)
		{
			perror("unlink error");
			return -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;
	}
	//数据收发
	char buf[128]="";
	//定义变量存放客户端地址信息结构体
	struct sockaddr_un cun;
	socklen_t socklen=sizeof(cun);
	while(1)
	{
		//清空数组
		bzero(buf,sizeof(buf));
		//从套接字文件读取消息
		recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cun,&socklen);
		printf("[%s]:%s\n",cun.sun_path,buf);
		//将字符串连接后回发
		strcat(buf,"*_*");
		//if(write(sfd,buf,sizeof(buf))==-1)
		if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cun,sizeof(cun))==-1)
		{
			perror("write error");
			return -1;
		}
		printf("发送成功\n");
	}
	//关闭套接字
	close(sfd);
	return 0;
}

4.2报式域套接字客户端

程序代码:

#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;
	}
	//域套接字绑定函数,只能绑定一个不存在的套接字文件
	//绑定前,判断当前文件是否存在
	if(access("./unix",F_OK)==0)
	{
		//文件存在,删除
		if(unlink("./unix")==-1)
		{
			perror("unlink error");
			return -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;
	}
	//填充服务器的地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;
	strcpy(sun.sun_path,"./linux");
	//数据收发
	char buf[128]="";
	while(1)
	{
		printf("请输入>>>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]=0;
		//发送给服务器
		sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sun,sizeof(sun));
		if(strcmp(buf,"quit")==0)
			break;
		//接收服务器发来的消息
		recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
		printf("收到消息:%s\n",buf);
	}
	//关闭套接字
	close(cfd);
	return 0;
}

运行结果:

流程图:

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

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

相关文章

【金三银四】每日一点面试题(Java--JVM篇)

1、说一下 JVM 的主要组成部分及其作用&#xff1f; JVM&#xff08;Java虚拟机&#xff09;是Java程序运行的核心组件&#xff0c;它负责将Java字节码翻译成底层操作系统能够执行的指令。JVM由以下几个主要组成部分构成&#xff1a; 类加载器&#xff08;Class Loader&#…

【sgCollapseBtn】自定义组件:底部折叠/展开按钮

特性&#xff1a; 支持自定义折叠状态支持自定义标签名称 sgCollapseBtn源码 <template><div :class"$options.name" click"show !show" :placement"placement"><div class"collapse-btns"><div class"c…

9.WEB渗透测试-Linux基础知识-Linux用户权限管理(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;8.WEB渗透测试-Linux基础知识-Linux基础操作&#xff08;二&#xff09;-CSDN博客 用户管…

10个软件测试的吐槽点!

问题一&#xff1a;测试时间评估 这是一个工作日常经常需要回复的问题&#xff0c;理论上&#xff0c;测试这边要做出较科学合理的回复&#xff0c;那就要将【需求变更】、【开发进度延误】、【bug 修复不稳定】、【复杂业务流程】、【测试环境不稳定】、【上下游服务依赖】、…

Javase-类与对象

文章目录 一 . 面向过程的初步认知二 . 如何创建一个类三 . 如何创建一个对象四 . this引用五 . 构造方法六 . 初始化 一 . 面向过程的初步认知 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对…

VUE3项目学习系列--项目配置(二)

在项目团队开发过程中&#xff0c;多人协同开发为保证项目格式书写格式统一标准化&#xff0c;因此需要进行代码格式化校验&#xff0c;包括在代码编写过程中以及代码提交前进行自动格式化&#xff0c;因此需要进行在项目中进行相关的配置使之代码格式一致。 一、eslint配置 …

http和https的区别是什么?

–前言 传输信息安全性不同、连接方式不同、端口不同、证书申请方式不同 一、传输信息安全性不同 1、http协议&#xff1a;是超文本传输协议&#xff0c;信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中的信息。 2、h…

微信小程序开发学习笔记《18》uni-app框架-网络请求与轮播图

微信小程序开发学习笔记《18》uni-app框架-网络请求 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、下载网络请求包 这个包是以前黑马程序员老师写的一个包&#xff0c;跟着课程学习&#x…

六、西瓜书——聚类

1.聚类任务 聚类是一种无监督学习&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律。聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster). 2.聚类度量 聚类性能度量亦称聚类“有效性指标”(validity index)。在…

07.IO流

07. IO流 01. 文件 1. 什么是文件 ​ 文件对我们并不陌生&#xff0c;文件是保存数据的地方&#xff0c;比如大家经常使用的word文档&#xff0c;txt文件&#xff0c;excel文件…都是文件。它既可以保存一张图片&#xff0c;可以保存视频&#xff0c;声音 2.文件流 ​ 文件…

【STA】多场景时序检查学习记录

单周期路径 建立时间时序检查 在时钟的有效沿到达触发器之前&#xff0c;数据应在一定时间内保持稳定&#xff0c;这段时间即触发器的建立 时间。满足建立时间要求将确保数据可靠地被捕获到触发器中。 建立时间检查是从发起触发器中时钟的第一个有效沿到捕获触发器中时钟后面…

【OJ】求和与计算日期

文章目录 1. 前言2. JZ64 求123...n2.1 题目分析2.2 代码 3. HJ73 计算日期到天数转换3.1 题目分析3.2 代码 4. KY222 打印日期4.1 题目分析4.2 代码 1. 前言 下面两个题目均来自牛客&#xff0c;使用的编程语言是c&#xff0c;分享个人的一些思路和代码。 2. JZ64 求123…n …

117.移除链表元素(力扣)

题目描述 代码解决 class Solution { public:ListNode* removeElements(ListNode* head, int val) {//删除头节点while(head!NULL&&head->valval){ListNode*tmphead;headhead->next;delete tmp;}//删除非头节点ListNode*curhead;while(cur!NULL&&cur-&g…

阿里云国际云解析DNS如何开启/关闭流量分析?

流量分析服务会涉及产生日志费用&#xff0c;所以开通内网DNS解析服务后&#xff0c;默认不会主动开启流量分析&#xff0c;需要您手动开启流量分析。对于未开启流量分析的用户&#xff0c;进入界面会提示您展示的都是模拟数据&#xff0c;您可以点击开启流量分析服务&#xff…

Vue+SpringBoot打造城市桥梁道路管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统&#xff0c;支持…

(十六)【Jmeter】取样器(Sampler)之测试活动(Test Action)

简述 操作路径如下: JMeter中的测试活动取样器实际上并不是一个具体的取样器类型,而是一种对测试计划中的多个取样器进行组合和执行的活动。常常被用作定时器,在某个请求之后等待多长时间。 参数说明 Logical Action on Thread(在线程上的逻辑操作) Pause Duration(mil…

“羊驼“入侵CV,美团浙大沈春华团队将LLaMA向CV扩展,构建全新基础模型VisionLLaMA

本文首发:AIWalker https://arxiv.org/abs/2403.00522 https://github.com/Meituan-AutoML/VisionLLaMA 本文概述 大型语言模型构建在基于Transformer的架构之上来处理文本输入, LLaMA 系列模型在众多开源实现中脱颖而出。类似LLaMa的Transformer可以用来处理2D图像吗&#xf…

关于数据库基本概念与基本介绍

​ 数据库是 一个组织良好的数据集合&#xff0c;旨在方便多个用户高效地共享信息资源 。以下是关于数据库的一些基本介绍&#xff1a; 1. 定义和目的&#xff1a;数据库是一个电子化的数据存储系统&#xff0c;设计用来存储、管理和检索数据。它允许用户或应用程序以各种复杂的…

【代码随想录算法训练营Day35】435.无重叠区间;763.划分字母区间;56.合并区间

文章目录 ❇️Day 36 第八章 贪心算法 part05✴️今日任务❇️435. 无重叠区间自己的思路自己的代码&#xff08;✅通过81.59%&#xff09;随想录思路随想录代码 ❇️763.划分字母区间自己的思路自己的代码&#xff08;✅通过55.30%&#xff09;随想录思路随想录代码 ❇️56. 合…

计算机网络-网络安全(二)

1.应用层安全协议&#xff1a; S-HTTP或SHTTP&#xff08;Sec HTTP&#xff09;&#xff0c;安全超文本传输协议&#xff0c;是HTTP扩展&#xff0c;使用TCP的80端口。HTTPS&#xff1a;HTTPSSL&#xff0c;使用TCP的443端口。和TLS&#xff08;传输层安全标准&#xff09;是双…