多点通信与域套接字:2024/3/4

news2025/1/3 2:25:49

作业1:广播

发送端:

#include <myhead.h>
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("sfd=%d\n",sfd);

	//2.设置当前套接字允许广播属性
	int broadcast=-1;
	if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-1){
		perror("setsockopt error");
		return -1;
	}

	//3.绑定(非必须)
	
	//4.填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=(8888);                //广播端口号
	sin.sin_addr.s_addr=inet_addr("192.168.199.255");   //广播地址

	//5.发送数据
	char sbuf[128]="";
	while(1)
	{
		//从终端获取数据
		printf("请输入>>>");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]=0;

		//发送数据
		sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("发送成功\n");

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

	return 0;
}

接收端:

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

	//2.绑定
	//填充地址信息结构体
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=(8888);                          //广播端口号
	cin.sin_addr.s_addr=inet_addr("192.168.199.255");   //广播地址

	//绑定
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//3.接收数据
	char rbuf[128]="";
	while(1)
	{
		//清空数据
		bzero(rbuf,sizeof(rbuf));

		//读取消息
		recvfrom(cfd,rbuf,sizeof(rbuf),0,NULL,NULL);
		printf("收到的消息为:%s\n",rbuf);

	}
	//4.关闭套接字
	close(cfd);

	return 0;
}

效果图:

作业2:组播

发送端:

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//1.创建套接字
	int sfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sfd==-1){
		perror("socket error");
		return -1;
	}
	//2.绑定(非必须)
	
	//3.发送消息
	//填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(8888);                          //组播端口号
	sin.sin_addr.s_addr=inet_addr("224.1.1.2");    //组播IP

	char sbuf[128]="";
	while(1)
	{
		//从终端获取数据
		printf("请输入>>>");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]=0;

		//发送数据
		sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("发送成功\n");

	}

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

	return 0;
}

接收端:

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

	//2.加入多播组
	struct ip_mreqn imr;
	imr.imr_multiaddr.s_addr=inet_addr("224.1.1.2");    //组播ip
	imr.imr_address.s_addr=inet_addr("192.168.199.131");   //本机ip
	imr.imr_ifindex=2;                  //网卡编号

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

	//3.绑定
	//填充地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family=AF_INET;
	rin.sin_port=htons(8888);                          //组播端口号
	rin.sin_addr.s_addr=inet_addr("224.1.1.2");         //组播ip

	//绑定
	if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//4.接收组播消息
	char rbuf[128]="";
	while(1)
	{
		//清空消息
		bzero(rbuf,sizeof(rbuf));

		//接收消息
		recvfrom(rfd,rbuf,sizeof(rbuf),0,NULL,NULL);

		printf("收到的消息为:%s\n",rbuf);

	}

	//5.关闭套接字
	close(rfd);

	return 0;
}

效果图:

作业3:流式域套接字

服务器端:

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

	//2.判断文件是否存在,存在则删除
	if(access("./mysocket",F_OK)==0){
		//存在,删除
		if(unlink("./mysocket")==-1){
			perror("unlink error");
			return -1;
		}
	}

	//3.绑定
	//填充地址信息结构体
	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");
	
	//4.开启监听
	if(listen(sfd,128)==-1){
		perror("listen error");
		return -1;
	}

	//5.阻塞等待客户端连接
	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");

	//6.进行数据收发
	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");

	}
	//7.关闭套接字
	close(sfd);
	close(newfd);

	return 0;
}

客户端:

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

	//2.判断文件是否存在,存在则删除
	if(access("./mysocket1",F_OK)==0){
		//存在,删除
		if(unlink("./mysocket1")==-1){
			perror("unlink error");
			return -1;
		}
	}

	//3.绑定(非必须)
	//填充地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;
	strcpy(sun.sun_path,"./mysocket1");

	//绑定
	if(bind(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//4.连接服务器
	struct sockaddr_un cun;
	cun.sun_family=AF_UNIX;
	strcpy(cun.sun_path,"./mysocket");

	if(connect(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){
		perror("connect error");
		return -1;
	}
	printf("connect success\n");

	//5.进行数据收发
	char wbuf[128]="";
	while(1)
	{
		//清空数据
		bzero(wbuf,sizeof(wbuf));

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

		if(strcmp(wbuf,"quit")==0){
			break;
		}
		//发送消息
		send(cfd,wbuf,strlen(wbuf),0);
		printf("发送成功\n");

		//接收服务器发来的消息
		bzero(wbuf,sizeof(wbuf));
		recv(cfd,wbuf,sizeof(wbuf),0);
		printf("收到的消息为:%s\n",wbuf);

	}
	//7.关闭套接字
	close(cfd);

	return 0;
}

效果图:

作业4:报式域套接字

服务器端:

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

	//2.判断文件是否存在,存在则删除
	if(access("./linux",F_OK)==0){
		//存在,删除
		if(unlink("./linux")==-1){
			perror("unlink error");
			return -1;
		}
	}

	//3.绑定
	//填充地址信息结构体
	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;
	}
	printf("bind success\n");

	//6.进行数据收发
	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," !!!");
		//发送消息
		sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cun,socklen);

	}
	//7.关闭套接字
	close(sfd);

	return 0;
}

客户端:

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//1.创建套接字
	int cfd=socket(AF_UNIX,SOCK_DGRAM,0);
	if(cfd==-1){
		perror("socket error");
		return -1;
	}

	//2.判断文件是否存在,存在则删除
	if(access("./linux1",F_OK)==0){
		//存在,删除
		if(unlink("./linux1")==-1){
			perror("unlink error");
			return -1;
		}
	}

	//3.绑定
	//填充地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;
	strcpy(sun.sun_path,"./linux1");

	//绑定
	if(bind(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//5.进行数据收发
	char wbuf[128]="";
	//定义地址信息结构体
	struct sockaddr_un cun;
	cun.sun_family=AF_UNIX;
	strcpy(cun.sun_path,"linux");

	while(1)
	{
		//清空数据
		bzero(wbuf,sizeof(wbuf));

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

		if(strcmp(wbuf,"quit")==0){
			break;
		}
		//发送消息
		sendto(cfd,wbuf,strlen(wbuf),0,(struct sockaddr*)&cun,sizeof(cun));
		printf("发送成功\n");

		//接收服务器发来的消息
		bzero(wbuf,sizeof(wbuf));
		recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);
		printf("收到的消息为:%s\n",wbuf);

	}
	//7.关闭套接字
	close(cfd);

	return 0;
}

效果图:

作业5:思维导图

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

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

相关文章

Android res/values/locale_config.xml文件

Android res/values/locale_config.xml文件 各个国家/地区在android系统里面的缩写代码。最典型的用途是本地化。 <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2015 The Android Open Source ProjectLicensed under the Apache L…

大模型推荐落地啦!融合知识图谱,蚂蚁集团发布!

引言&#xff1a;电商推荐系统的新突破 随着电子商务平台的蓬勃发展&#xff0c;推荐系统已成为帮助用户在信息过载时代中筛选和发现产品的关键工具。然而&#xff0c;传统的推荐系统主要依赖历史数据和用户反馈&#xff0c;这限制了它们在新商品推出和用户意图转变时的有效性…

【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+辗转相除法)

[蓝桥杯 2019 省 B] 等差数列 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列&#xff0c;只记得其中 N N N 个整数。 现在给出这 N N N 个整数&#xff0c;小明想知道包含这 N N N 个整数的最短的等差数列有几项&#xff1f; 输…

ROS 2基础概念#3:主题(Topic)| ROS 2学习笔记

在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;主题&#xff08;Topics&#xff09;是实现节点之间通信的主要机制之一。节点&#xff08;Node&#xff09;可以发布&#xff08;publish&#xff09;消息到话题&#xff0c;或者订阅&#xff08;subscribe&…

搜索回溯算法(DFS)1------递归

目录 简介&#xff1a; 递归问题解题的思路模板 例题1&#xff1a;汉诺塔 例题2&#xff1a;合并两个有序链表 例题3&#xff1a;反转链表 例题4&#xff1a;两两交换链表中的节点 例题5&#xff1a;Pow&#xff08;x,n&#xff09;-快速幂 结语&#xff1a; 简介&…

攻防世界-get_post

题目信息 相关知识 -G&#xff1a;表示GET请求&#xff0c;缺省POST -d参数用于发送 POST 请求的数据体 使用-d参数以后&#xff0c;HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法&#xff0c;因此可以省略-X PO…

Vue.js 深度解析:模板编译原理与过程

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

Springboot+vue的船舶监造系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的船舶监造系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的船舶监造系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff…

山西电力市场日前价格预测【2024-02-25】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-25&#xff09;山西电力市场全天平均日前电价为386.45元/MWh。其中&#xff0c;最高日前电价为765.92元/MWh&#xff0c;预计出现在18:45。最低日前电价为203.79元/MWh&#xff0c;预计…

【计算机毕业设计】044学生管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

C# 不可识别数据库格式问题

C#是一种流行的编程语言&#xff0c;用于开发各种类型的应用程序&#xff0c;包括与数据库交互的应用程序。然而&#xff0c;在处理数据库时&#xff0c;有时会遇到一些错误和问题。其中之一就是数据库格式不可识别的错误。 在C#中&#xff0c;我们通常使用ADO.NET来连接和操作…

【教程】Kotlin语言学习笔记(四)——方法(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 文章目录 【…

openGauss学习笔记-235 openGauss性能调优-系统调优-资源负载管理-资源管理准备-创建资源池

文章目录 openGauss学习笔记-235 openGauss性能调优-系统调优-资源负载管理-资源管理准备-创建资源池235.1 背景信息235.2 前提条件235.3 操作过程235.3.1 创建资源池235.3.2 管理资源池235.3.3 删除资源池 235.4 查看资源池的信息 openGauss学习笔记-235 openGauss性能调优-系…

探索Ubuntu命令行:常见问题与解决方案

一、引言 Ubuntu&#xff0c;作为一款流行的Linux发行版&#xff0c;其命令行界面&#xff08;CLI&#xff09;为用户提供了丰富的功能和灵活性。然而&#xff0c;对于新手来说&#xff0c;命令行可能会带来一些挑战。本文将探讨一些在使用Ubuntu命令行时可能遇到的问题及其解决…

Python算法100例-3.1 回文数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展7.巧用字符串技巧 1&#xff0e;问题描述 打印所有不超过n&#xff08;取n<256&#xff09;的其平方具有对称性质的数&#xff08;也称回…

加密与安全_ 凯撒密码

文章目录 Pre概述Code 实现 凯撒密码字母频率分析攻击Code解密凯撒密码 小结 Pre PKI - 02 对称与非对称密钥算法 概述 凯撒密码是一种简单的替换加密技术&#xff0c;也称为移位密码。它是古典密码学中最早的密码之一&#xff0c;得名于古罗马军队领袖凯撒尤利乌斯&#xff…

VMware虚拟机安装Linux

1.新建虚拟机 2. 安装操作系统 等待 选择中文 点软件选择 选择下面的GNOME桌面 禁用KDUMP 点进安装位置&#xff0c;点完成就可以了 网络连接&#xff0c;右上角打开 开始安装&#xff0c;输入ROOT密码&#xff0c;创建用户 点击重启&#xff0c;等待 重启完成之后出现下面的界…

MATLAB环境下基于离散小波变换的心电信号伪影去除及PQRST波检测

可穿戴个人健康监护系统被广泛认为是下一代健康监护技术的核心解决方案。监护设备不断地感知、获取、分析和存储大量人体在日常活动中的生理数据&#xff0c;为人体的健康状况提供必要的、准确的、集成的和长期的评估和反馈。在心电监测领域&#xff0c;可穿戴传感器具有以下应…

镜头畸变模型及去畸变的原理

1. OpenCV去畸变undistortPoints原理解析 Opencv中镜头畸变包含了径向畸变和切向畸变&#xff0c;本章节主要阐述镜头畸变模型以及去畸变的原理。 1.1 镜头畸变模型 参考opencv文档 https://docs.opencv.org/3.1.0/d4/d94/tutorial_camera_calibration.html&#xff0c;opencv…

布隆过滤器实战

一、背景 本篇文章以解决实际需求的问题的角度进行切入&#xff0c;探讨了如果使用布隆过滤器快速丢弃无效请求&#xff0c;降低了系统的负载以及不必要的流量。 我们都知道布隆过滤器是以占用内存小&#xff0c;同时也能够实现快速的过滤从而满足我们的需求&#xff0c;本篇…