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

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

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

运行:

思维导图:

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

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

相关文章

[计算机网络]:流量控制

一、流量控制简介 一条TCP连接的每一侧主机都为其设置了接收缓存&#xff0c;当TCP成功连接后&#xff0c;它发送的数据会放入接受缓存中。相关联的进程会从缓存中读取数据。但是存在一个问题&#xff0c;当某应用程序读取数据速率太慢&#xff0c;而发送数据一方不停的发送数…

计算机网络 网络原理之Http

目录 1 前言2 什么是http的一次交互&#xff1f;3 理解“协议”二字4 认识URL4.1 简介4.2 URL的编码和解码(urlencode和urldecode) 5 抓包工具 fiddler6 http和https的区别7 http 头8 HTTP 状态码9 常见的 Http 服务器 1 前言 为什么要了解Http原理呢&#xff1f;因为http原理…

Vue.js中的diff算法:让虚拟DOM更高效

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

计算机设计大赛 深度学习疲劳驾驶检测 opencv python

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

排序算法:插入排序

文章目录 插入排序 插入排序 什么叫插入排序&#xff1f; 也就是把数字从前&#xff0c;或者从最后开始比较然后插入到这个数的前面或者后面&#xff0c;从[0,end]区间插入 void InsertSort(int* a,int n) {for (int i 1; i < n; i){int end i-1;int tmp a[i];while (end…

华为配置基于VLAN限速示例

华为配置基于VLAN限速示例 组网图形 图1 流量监管配置组网图 表1 Switch为上行流量提供的QoS保障 流量类型 CIR(kbps) PIR(kbps) DSCP优先级 语音 2000 10000 46 视频 4000 10000 30 数据 4000 10000 14 ^^^ 流分类简介配置注意事项组网需求配置思路操作步…

实名制交友-智能匹配-仿二狗交友系统-TP6+uni-APP小程序H5公众号-源码交付-支持二开!

一、代码风格 通常不同的开发者具备不同的代码风格&#xff0c;但为了保证语音交友系统开发质量&#xff0c;在编码前需要进行代码风格的统一&#xff0c;通过制定一定的规则&#xff0c;约束开发者的行为。具有统一风格的代码才能更清晰、更完整、更容易理解、更方便后期维护…

【CSS】(浮动定位)易忘知识点汇总

浮动特性 加了浮动之后的元素,会具有很多特性,需要我们掌握的. 1、浮动元素会脱离标准流(脱标&#xff1a;浮动的盒子不再保留原先的位置) 2、浮动的元素会一行内显示并且元素顶部对齐 注意&#xff1a; 浮动的元素是互相贴靠在一起的&#xff08;不会有缝隙&#xff09;&…

基于机器学习的密码强度检测

项目简介 利用机器学习对提供的数据集预测用户输入的密码是否为弱密码。 原始数据集只包含关于弱密码的信息&#xff0c;并没有包含强密码的数据或分类器&#xff0c;这意味着模型无法学习到强密码的规律!!! 我之所以这样设计这个示例&#xff0c;其目的是为了向你展示模型的…

python统计分析——单变量数据统计作图

参考资料&#xff1a;python统计分析-托马斯 1、导入库和数据准备 # 导入库 # 用于数值处理的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 import matplotlib.pyplot as plt import seaborn as sns sns.set()# 数…

安全特性 悬垂指针

英文名称 Dangling point&#xff0c;它还有一个兄弟叫 wild point - 野指针。 简单的对Dangling point做一个类比&#xff1a;我换手机号码了&#xff0c;但是没有通知老板&#xff0c;老板通讯录存的是我的旧号码。然后老板打电话有两种可能&#xff1a;打不通电话或者电话打…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(十五)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

优化算法之最速梯度下降法、牛顿法、拟牛顿法(DFP及BFGS)

优化算法之最速梯度下降法、牛顿法、拟牛顿法 一、最速梯度下降法 我们知道常规的梯度下降法迭代法公式如下&#xff1a; θ ( k 1 ) θ ( k ) − η ∇ f ( θ ( k ) ) \theta^{(k1)} \theta^{(k)} - \eta\nabla f(\theta^{(k)}) θ(k1)θ(k)−η∇f(θ(k)) 迭代公式中包…

适配Ollama的前端界面Open WebUI

在前文 本地大模型运行框架Ollama 中&#xff0c;老苏留了个尾巴&#xff0c;限于篇幅只是提了一下 Open WebUI&#xff0c;有网友留言说自己安装没搞定&#xff0c;今天我们来补上 文章传送门&#xff1a;本地大模型运行框架Ollama 什么是 Open WebUI &#xff1f; Open WebUI…

LabVIEW眼结膜微血管采集管理系统

LabVIEW眼结膜微血管采集管理系统 开发一套基于LabVIEW的全自动眼结膜微血管采集管理系统&#xff0c;以提高眼结膜微血管临床研究的效率。系统集成了自动化图像采集、图像质量优化和规范化数据管理等功能&#xff0c;有效缩短了图像采集时间&#xff0c;提高了图像质量&#…

运维随录实战(2)之k8s部署应用

一, 创建.gitlab-ci.yml文件 架构流程 文件内容 stages: #设置流水线模版- build # 编译- source2img- deploy # 发布variables: # 设置全局变量MAVEN_PATH: .m2MAVEM_IMAGE: maven:3.8.5-openjdk-17-slim # maven 打包使用的镜像MAVEN_CLI_OPTS: "-s $MAVEN_PATH/set…

【观点】区块链的未来:分布式商业;企业的未来:分布式商业生态战略

本文内容摘自思二勋所著的《分布式商业生态战略》一书。 近两年&#xff0c;商业经济环境的不确定性越来越明显&#xff0c;市场经济受到疫情、技术、政策等多方因素影响越来越难以预测&#xff0c;黑天鹅事件时有发生。在国内外经济方面&#xff0c;国际的地缘政治对商业经济…

基于R语言实现线性回归模型及测试应用

基于R语言实现线性回归模型及测试应用 mpgB0B1*dartE 调用R语言函数 >data(mtcars) >head(mtcars) > mod <- lm(formula mpg ~ drat, data mtcars) > summary(mod) > # 画出拟合的线 >abline(mod, col "blue") >points(mtcars$drat, mt…

【Linux命令】fuser

fuser 使用文件或文件结构识别进程。 详细 fuser命令用于报告进程使用的文件和网络套接字。fuser命令列出了本地进程的进程号&#xff0c;哪些本地进程使用file&#xff0c;参数指定的本地或远程文件。 每个进程号后面都跟随一个字母&#xff0c;该字母指示进程如何使用该文…

14-RPC-自研微服务框架

RPC RPC 框架是分布式领域核心组件&#xff0c;也是微服务的基础。 RPC &#xff08;Remote Procedure Call&#xff09;全称是远程过程调用&#xff0c;相对于本地方法调用&#xff0c;在同一内存空间可以直接通过方法栈实现调用&#xff0c;远程调用则跨了不同的服务终端&a…