网络编程 24/3/4 作业

news2024/11/19 11:21:17

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、思维导图

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

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

相关文章

【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…

MySQL面试题纯享版

基础内容 1、MySQL的架构分层 2、一条 SQL 查询语句的执行流程 3、如何查看 MySQL 服务被多少个客户端连接了&#xff1f; 4、 空闲连接会一直占用着吗&#xff1f; 5、MySQL 的连接数有限制吗&#xff1f; 6、 怎么解决长连接占用内存的问题&#xff1f; 7、执行器与存储引擎…

Java 并发编程 面试题及答案整理,最新面试题

Java中的volatile关键字有什么作用&#xff1f; volatile关键字在Java中的作用包括&#xff1a; 1、保证可见性&#xff1a; 确保变量的修改对其他线程立即可见。 2、防止指令重排&#xff1a; 防止编译器对操作进行重排序&#xff0c;保证代码的执行顺序。 3、非原子性&am…

xss.haozi.me:0x0B

<svg><script>(1)</script>

数仓实战——京东数据指标体系的构建与实践

目录 一、如何理解指标体系 1.1 指标和指标体系的基本含义 1.2 指标和和标签的区别 1.3 指标体系在数据链路中的位置和作用 1.4 流量指标体系 1.5 指标体系如何向上支撑业务应用 1.6 指标体系背后的数据加工逻辑 二、如何搭建和应用指标体系 2.1 指标体系建设方法—OS…

数电票又增新票种 百望云率先推出机动车数电票解决方案

经过两年多的试点推广&#xff0c;数电票工程已经覆盖全国大部分省区市&#xff08;含计划单列市&#xff09;&#xff0c;随着系统建设的深入&#xff0c;不仅是应用功能逐渐完善&#xff0c;对票种的支持也走向全面。 2023年11月天津市正式开启机动车数电票的开具功能&#x…

解决win10串口一直被占用

目录 问题描述解决方法 问题描述 串口设备一直被占用&#xff0c;换串口也没有用&#xff0c;永远都是串口正在被使用&#xff0c;甚至换硬件设备也不行&#xff0c;都快烦死了 解决方法 输入这个&#xff1a; 删除这个玩意&#xff0c;计算机\HKEY_LOCAL_MACHINE\SYSTEM\Cu…

数字逻辑与计算机组成

逻辑代数 按一定逻辑关系进行运算的代数 与普通代数相同的是&#xff1a;都是由变量 (逻辑变量)、常量 (逻辑常量) 和一些运算符组成的代数系统 与普通代数不同的是&#xff1a; &#xff08;1&#xff09;逻辑常量&#xff1a;0 和 1&#xff0c;不表示数值大小&#xff0…

FreeRTOS操作系统学习——FreeRTOS工程创建

FreeROTS工程创建 详细步骤 如无特殊情况&#xff0c;大部人都要配置为外部高速时钟 另外&#xff0c;本实验使用了FreeRTOS&#xff0c;FreeRTOS的时基使用的是Systick&#xff0c;而 STM32CubeMX中默认的HAL库时基也是Systick&#xff0c;为了避免可能的冲突&#xff0c;最…

停止Tomcat服务的方式

运行脚本文件停止 运行Tomcat的bin目录中提供的停止服务的脚本文件 关闭命令 # sh方式 sh shutdown.sh# ./方式 ./shutdown.sh操作步骤 运行结束进程停止 查看Tomcat进程&#xff0c;获得进程id kill进程命令 # 执行命令结束进程 kill -9 65358 操作步骤 注意 kill命令是…

CentOS7 Zookeeper3.8.3 单节点安装

CentOS7 Zookeeper3.8.3 单节点安装 1、把压缩包丢tools里&#xff0c;进tools cd /tools2、解压到training tar -zxvf /tools/apache-zookeeper-3.8.3-bin.tar.gz -C /training3、进training cd /training4、重命名 mv apache-zookeeper-3.8.3-bin zookeeper5、进zookeep…

构建信息蓝图:概念模型与E-R图的技术解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

7.2.2 用坐标表示平移 教案设计及课堂检测设计

【学习目标】 1&#xff0e;掌握坐标变化和图形平移的关系&#xff0c;能用点的平移规律求点平移后的点的坐标&#xff0e; 2&#xff0e;会按要求画出平移后的图形&#xff0c;并写出顶点的坐标&#xff0e;

稀碎从零算法笔记Day5-LeetCode:多数元素

题型&#xff1a;数组、计数、排序、STL函数、查找众数 链接&#xff1a;169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 题目描述 给定一个大小为 n …

二手手机管理系统|基于Springboot的二手手机管理系统设计与实现(源码+数据库+文档)

二手手机管理系统目录 目录 基于Springboot的二手手机管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户管理功能的实现界面 2、用户中心管理功能的实现界面 3、新闻信息管理功能的实现界面 4、商品收藏管理功能的实现界面 5、订单管理功能的实现界…

浅析扩散模型与图像生成【应用篇】(六)——DiffuseIT

6. Diffusion-based Image Translation using Disentangled Style and Content Representation 本文介绍了一种基于扩散模型的图像转换方法&#xff0c;图像转换就是根据文本引导或者图像的引导&#xff0c;将源图像转换到目标域中&#xff0c;如下图所示。   在图像转换中待…

Java 面试题及答案整理,最新面试题

Java中的内存模型是如何设计的&#xff1f; Java的内存模型主要包括堆、栈、方法区和本地方法栈几个关键部分&#xff1a; 1、堆&#xff08;Heap&#xff09;&#xff1a; 这是Java内存管理中最大的一块&#xff0c;被所有线程共享。在堆中主要存放对象实例和数组。 2、栈&…

「经验」在博途中 是否可以在 LAD与STL 语言之间进行切换

用惯了STEP7&#xff0c;准确来说是SIMATIC Manager进行编程开发的同学&#xff0c;在转战TIA portal后&#xff0c;通常会经历一段“晦涩”的过度期&#xff0c;包括指令库的微小变动、工作界面的大改等等。 又比如&#xff1a;“在博途中&#xff0c;怎么快速切换LAD与STL语…

7.1.3 Selenium的用法2

目录 1. 切换 Frame 2. 前进后退 3. 对 Cookies 操作 4. 选项卡管理(了解) 5. 异常处理 6. 反屏蔽 7. 无头模式 1. 切换 Frame 我们知道网页中有一种节点叫作 iframe&#xff0c;也就是子 Frame&#xff0c;相当于页面的子页面&#xff0c;它的结构和外部网页的结构完全…

计算机网络、协议、端口号

1&#xff0c;TCP&#xff1a;面向连接服务的协议 2&#xff0c;IP、UDP&#xff1a;面向无连接的协议 3&#xff0c;OST参考模型&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 低三层&#xff1a;通信子网&#xff1b;中三层&#xff1a;资源子…