42、网络编程/多点通信和域套接字通信模型20240304

news2024/12/23 23:47:53

一、多点通信之广播的收发端实现

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("setsockopt 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.32.255");

	char sbuf[128]="";
	while(1)
	{
		printf("请输入>>>");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]=0;//向广播地址发送数据
		sendto(sfd,sbuf,strlen(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("发送成功\n");
	}
	close(sfd);
	return 0;
}

2.广播接收端代码:

int main(int argc, const char *argv[])
{
	int rfd=socket(AF_INET,SOCK_DGRAM,0);//基于ipv4的udp模型实现广播
	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.32.255");//ip地址主机号全为1的地址为广播地址

	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;
}

运行:

二、多点通信之组播的收发实现

1.组播发送端代码

#include<myhead.h>

int main(int argc, const char *argv[])
{
	//创建套接字
	int rfd=socket(AF_INET,SOCK_DGRAM,0);//基于ipv4的udp模型
	if(rfd==-1)
	{
		perror("socket error");
		return -1;
	}
	//绑定端口和ip地址
	struct sockaddr_in rin;
	rin.sin_family=AF_INET;
	rin.sin_port=htons(9999);//自身端口号
	rin.sin_addr.s_addr=inet_addr("192.168.32.130");//ip地址

	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");//组播的ip
	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.组播接收端代码

#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.32.130");//本机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("收到消息:%s\n",rbuf);
	}
	close(rfd);
	
	return 0;
}

运行结果:

三、 流式域套接字(基于tcp)的服务器、客户端实现。

1.服务器代码:

#include<myhead.h>

int main(int argc, const char *argv[])
{
	int sfd=socket(AF_UNIX,SOCK_STREAM,0);//通过设置参数不同创建域套接字 传输方式tcp
	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 error");
    //接收客户端发来的链接请求,并保存客户端地址信息,返回新的文件描述符用于通信
	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;
	}
	puts("已接受新客户端连接");
	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,"*_*");//回复消息
		send(newfd,rbuf,strlen(rbuf),0);
		printf("发送成功\n");
	}
	close(sfd);
	close(newfd);
	return 0;
}

 2.客户端代码

#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;
	}
	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,"./mysocket");
	if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1)//连接服务器
	{
		perror("connet error");
		return -1;
	}
	printf("connet success\n");

	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;
}

运行:

四、报式域套接字 (基于udp)的服务器、客户端实现。

1.服务器代码

#include<myhead.h>

int main(int argc, const char *argv[])
{
	int sfd=socket(AF_UNIX,SOCK_DGRAM,0);//创建基于udp创建域套接字
	if(sfd==-1)
	{
		perror("socket error");
		return -1;
	}
	if(access("./linux1",F_OK)==0)//检查文件是否存在如果存在则删除
	{
		if(unlink("./linux1")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}
	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("收到消息为:%s\n",rbuf);

		strcat(rbuf,"*_*");//给发来消息的客户端回复
		if(sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cun,sizeof(cun))==-1)
		{
			perror("sendto error");
			return -1;
		}
	}
	close(sfd);
	return 0;
}

2.客户端代码

#include<myhead.h>

int main(int argc, const char *argv[])
{
	int cfd=socket(AF_UNIX,SOCK_DGRAM,0);//创建域套接字 传输方式udp
	if(cfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("cfd=%d\n",cfd);
	if(access("./linux2",F_OK)==0)
	{
		if(unlink("./linux2")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}	
	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;
	}
	printf("bind success\n");
	
	char wbuf[128]="";
	struct sockaddr_un sun;//保存服务器地址
	sun.sun_family=AF_UNIX;
	strcpy(sun.sun_path,"./linux1");

	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*)&sun,sizeof(sun));
		printf("发送成功\n");
		bzero(wbuf,sizeof(wbuf));
		recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);//接收消息,因为前面已经有了服务器地址信息 所以此处可以不接收
		printf("收到消息:%s\n",wbuf);
	}
	close(cfd);
	return 0;
}

运行:

思维导图:

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

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

相关文章

【AI视野·今日NLP 自然语言处理论文速览 第八十一期】Mon, 4 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 4 Mar 2024 Totally 48 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Mitigating Reversal Curse via Semantic-aware Permutation Training Authors Qingyan Guo, Rui Wang, Junlia…

J013_简易商家外卖系统

一、需求描述 1、完成菜品的上架功能 2、完成菜品的浏览功能 二、开发设计 1、需要设计一个菜品类&#xff0c;用于创建菜品对象 2、需要一个菜品操作类&#xff0c;用于封装菜品上架和菜品浏览功能 3、测试程序 三、代码实现 3.1 Food类 package com.itheima.arrayli…

Linux下安装MinDoc文档

文章目录 背景下载文件将M i n D o c放到目录内解压文件创建数据库配置数据库启动程序演示图 背景 由于日前自己的项目&#xff0c;需要分对外的公开文档&#xff0c; 但是又不想写页面&#xff0c;所以就在网上找了份文档项目。 具体使用步骤如下&#xff1a; 下载文件 请从…

Flutter中Widget的生命周期

Widget生命周期&#xff1a; createState-initState-didChangeDependency-build-deactive-dispose 可通过WidgetsBinding类对widget生命周期的回调进行监控。 createState&#xff1a;StatefulWidget 中用于创建 State&#xff1b; initState&#xff1a;State 的初始化操作&am…

电脑提示bluescreen蓝屏怎么解决? 电脑蓝屏bluescreen修复方法

电脑提示bluescreen蓝屏怎么解决&#xff1f;电脑突然蓝屏提示blueScreen&#xff0c;该怎么解决这个问题呢&#xff1f;下面我们就来分享三种电脑蓝屏bluescreen修复方法&#xff0c;需要的朋友可以参考下 不少朋友都遇到了bluescreen蓝屏的现象&#xff0c;那么出现这种情况…

2.8k star! 用开源免费的edge-tts平替科大讯飞的语音合成服务

edge-tts是github上的一个开源项目&#xff0c;可以免费将文本转为语音&#xff0c;别看它只有2.8k star&#xff0c;替代科大讯飞的收费TTS服务完全没问题&#xff0c;因为这个项目实际是调用的微软edge的在线语音合成服务&#xff0c;支持40多种语言&#xff0c;300多种声音&…

YOLOv8从入门到入土使用教程!(一)训练模型

⭐⭐⭐瞧一瞧看一看&#xff0c;新鲜的YOLOv9魔改专栏来啦&#xff01;⭐⭐⭐ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文将演示如何使用YOLOv8进行训练及预测&#xff01; 二…

three.js如何实现简易3D机房?(一)基础准备-上

目录 一、tips 二、功能说明 1.模型初始化 2.功能交互 三、初始化准备 1.目录结构 2.创建三要素 3.创建轨道控制器 4.初始化灯光 5.适配 6.循环渲染 一、tips 1.three.js入门的相关基础性知识就不在此过多赘述了&#xff0c;可以自行提前了解 three.js docs&…

MySql缓冲池命中率

缓冲池 大小查看 show variables like innodb_buffer_pool_size; 太小的innodb_buffer_pool_size是不利于性能的提升 命中率查看 一 、 通过以下命令查看相关数据&#xff1a; show global status like Innodb_buffer_pool_read%;结果如下&#xff1a; 命中率公式&#xff1…

SkyWalking链路追踪上下文TraceContext的追踪身份traceId生成的实现原理剖析

结论先行 SkyWalking 通过字节码增强技术实现&#xff0c;结合依赖注入和控制反转思想&#xff0c;以SkyWalking方式将追踪身份traceId编织到链路追踪上下文TraceContext中。 是不是很有趣&#xff0c;很有意思&#xff01;&#xff01;&#xff01; 实现原理剖析 TraceConte…

bun build

Bun 的快速原生打包器现已进入测试版阶段。可通过 bun build CLI 命令或 Bun.build() JavaScript API 使用。 bun build ./index.tsx --outdir ./build await Bun.build({entrypoints: [./index.tsx],outdir: ./build, }); 速度很快。下面的数字代表 esbuild 在 three.js 基…

PHP+MySQL实现后台管理系统增删改查之够用就好

说明 最近要给博客弄个后台&#xff0c;不想搞得很复杂&#xff0c;有基本的增删改查就够了&#xff0c;到网上找了一圈发现这个不错&#xff0c;很实用&#xff0c;希望可以帮到大家&#xff0c;需要的朋友评论区留下邮箱&#xff0c;我安排发送。 演示效果 项目介绍 本项目…

libigl 极小曲面(局部迭代法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 我们的目标是想得到一个曲率处处为0的曲面,具体操作如下所述: 二、实现代码 #include <igl/colon.h> #include

『Linux从入门到精通』第 ㉕ 期 - System V 共享内存

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;共享内存原理&#x1f427;共享内存相关函数&#x1f426;key 与 shmid 区别 &#x1f427;代码实例 &#x1f490;专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0…

智能电网监控:图像分类技术在能源电力领域的创新应用

一、引言 在当今这个对能源效率要求日益增长的时代&#xff0c;电力行业正面临着前所未有的挑战。为了满足日益增长的电力需求&#xff0c;同时确保电网的稳定性和可靠性&#xff0c;我们采用了一种革命性的方法&#xff1a;通过智能算法和自动化技术来优化电网的运行。这一项…

最短路径Floyd算法

第一题&#xff1a;[USACO08OPEN] Clear And Present Danger S #include<bits/stdc.h> using namespace std; int n,m; int g[105][105]; int arr[100005]; long long sum; int main() {scanf("%d%d",&n,&m);for(int i1;i<m;i){scanf("%d"…

Python不换行print在终端中不显示

问题描述 当使用不换行 print 即 print(‘test, end) 后立即关闭标准输出 sys.stdout open(os.devnull, w)则 print 的内容不会显示在正常的终端上&#xff08;例外是 PyCharm 中的终端能够正常显示&#xff09;。 复现问题 复现该问题的简易代码&#xff1a; import sys,…

带你全方位体验 Amazon Connect

1.前言 授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道。 近日亚马逊云科技在拉斯维加斯拉开了年度客户大会-亚马逊云科技 re:Invent 的序…

关于淘宝的nodejs镜像网址更新后,前端项目出现的一系列问题解决方案。

问题 npm install&#xff0c;之前是成功的&#xff0c;最近不成功。 原因 之前的npm.taobao.org镜像源已经停用 解决方法 把所有的npm.taobao.org替换成npmmirror.com&#xff0c;这个新的淘宝镜像地址 如果使用nvm(没有忽略)需要修改如下&#xff1a; nvm node_mirror…

vulhub中Wordpress 4.6 任意命令执行漏洞复现

由于Mysql初始化需要一段时间&#xff0c;所以请等待。成功运行后&#xff0c;访问http://your-ip:8080/打开站点&#xff0c;初始化管理员用户名和密码后即可使用&#xff08;数据库等已经配置好&#xff0c;且不会自动更新&#xff09;。 发送如下数据包&#xff0c;可见/tmp…