3.4作业

课上代码复习:

广播接收端代码:

#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.244.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("收到消息:%s\n",rbuf);
	}


	//关闭套接字
	close(rfd);
	return 0;
}

广播发送端代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字
	int sfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sfd == -1)
	{
		perror("sockeet 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.244.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;
}

组播接收端代码:

#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.244.140");   //本地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;
}

组播发送端代码:

#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(9999);
	rin.sin_addr.s_addr = inet_addr("192.168.244.140");


	//绑定端口号和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");
	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");
	}
	return 0;
}

流式域套接字

TCP服务器端实现:

#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,"*_*");
		//发送回去
		send(newfd,rbuf,strlen(rbuf),0);
		printf("发送成功\n");

	}


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

	return 0;
}

TCP客户端实现:

#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.绑定(非必须)
	//填充地址信息结构体
	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;
	}

	
	//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);
	}
	//5.关闭套接字
	close(cfd);
	return 0;
}

UDP服务器端实现:

#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("收到信息为:%s\n",rbuf);

		//将消息加“*_*”返回
		strcat(rbuf,"*_*");
		if(sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cun,socklen) == -1)
		{
			perror("sendto error");
			return -1;
		}
	}

	//关闭套接字
	close(sfd);
	return 0;
}

UDP客户端实现:

#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("./linux2") == -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("请输入:");
		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));

	

		}

	//关闭套接字
	close(cfd);
	return 0;
}

课程总结:

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

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

相关文章

在 Flutter 中使用 flutter_gen 简化图像资产管理

你是否厌倦了在 Flutter 项目中手动管理图像资产的繁琐任务&#xff1f; 告别手工输入资源路径的痛苦&#xff0c;欢迎使用“Flutter Gen”高效资源管理的时代。在本文中&#xff0c;我将带您从手动处理图像资源的挫折到动态生成它们的便利。 选择1&#xff1a;痛苦手动添加–…

达梦数据库基础操作(五): 索引操作

达梦数据库基础操作(五)&#xff1a; 索引操作 1. 索引操作 1.1 创建索引 # 使用 CREATE INDEX 语句创建普通索引。 CREATE INDEX ind_emp_salary ON employee(salary);1.2 查看创建的索引 # 通过字典表 user_indexes 查看已创建索引的名称、类型。SELECT table_name, index…

C语言经典算法-1

C语言经典算法讲解练习 文章目录 C语言经典算法讲解练习1.汉若塔2.费式数列3. 巴斯卡三角形4.三色棋5.老鼠走迷官&#xff08;一&#xff09;6.老鼠走迷官&#xff08;二&#xff09;7.骑士走棋盘8.八皇后9.八枚银币10.生命游戏 1.汉若塔 说明&#xff1a;河内之塔(Towers of …

ArmSoM Rockchip系列产品 通用教程 之 UART 使用

1. UART 简介​ Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准&#xff0c;完整模块支持以下功能&#xff1a; 支持5、6、7、8 bits数据位。支持1、1.5、2 bits停止位。支持奇校验和偶校验&#xff0c;不支持mark校验和space校验。支持接…

文物保护平台数据统计分析及预警-子系统专题分析

文物预防性监测与调控系统的监测统计分析子系统提供全面的文物状态及环境数据分析,为博物馆工作人员进行基于文物材质特性的专项保护提供相关科研辅助。主要的监测分析,包括各展厅文物统计分析、不同环境因素报表统计、以及监测调控设备统计分析等。 系统用户和文物管理人员可以…

onnx runtime文档学习2-torch TF简单示例

网上充斥着ONNX Runtime的简单科普&#xff0c;却没有一个系统介绍ONNX Runtime的博客&#xff0c;因此本博客旨在基于官方文档进行翻译与进一步的解释。ONNX runtime的官方文档&#xff1a;https://onnxruntime.ai/docs/ 如果尚不熟悉ONNX格式&#xff0c;可以参照该博客专栏…

Nodejs 第四十七章(redis主从复制)

Redis主从复制是一种数据复制和同步机制&#xff0c;其中一个Redis服务器&#xff08;称为主服务器&#xff09;将其数据复制到一个或多个其他Redis服务器&#xff08;称为从服务器&#xff09;。主从复制提供了数据冗余备份、读写分离和故障恢复等功能。 以下是Redis主从复制的…

redis06 redis事务

思维草图 redis事务认识 redis事务是一个单独的隔离操作&#xff0c;事务中的所有命令都会序列化、按顺序地执行&#xff0c;事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 redis事务的主要作用就是串联多个命令防止别的命令插队。 Multi、Exec、…

稀碎从零算法笔记Day9-LeetCode:最长公共前缀

题型&#xff1a;字符串 链接&#xff1a;14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述&#xff08;红字为笔者添加&#xff09; 编写一个函数来查找字符串数组中的最长公共前缀(前X个字母相同)。 如果不存在公共前缀&…

【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

目录 1.随机链表的复制 1.2题目描述 1.3题目分析 1.4解题&#xff1a; 2.顺序表和链表对比 2.1cpu高速缓存利用率 3.结语 1.随机链表的复制 一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random 该指针可以指向链表中的任何节点或空节点。 1.2题目描…

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图&#xff1a;Discuz X3.5的系统信息&#xff0c;上传许可为1024MB(1GB) 论坛为局域网论坛&#xff0c;仅供内部同事交流使用&#xff01; 使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图&#xff1a;选择上传附件&#xff08;提示可以最大上传100M&#xff09;…

【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject&#xff1f; 在游戏开发中&#xff0c;有大量的配置数据需要存储&#xff0c;这个时候就需要ScriptableObject来存储数据了。 很多人会说我可以用json、xml、txt&#xff0c;excel等等 但是你们有没有想过&#xff0c;假设你使用的是json&#x…

Python 面向对象编程——类的使用

一、学习目标 1&#xff0e;掌握类的定义和实例化对象。 2&#xff0e;熟练掌握类的构造函数__init__使用。 3&#xff0e;掌握类的继承机制和使用。 二、相关练习 1、定义一个玩具类Toy()&#xff0c;创建名字为“小汽车”、“手枪”和“积木”的玩具实例&#xff0c;计…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:多态样式)

设置组件不同状态下的样式。 说明&#xff1a; 从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 从API Version 11开始支持另一种写法attributeModifier&#xff0c;可根据开发者需要动态设置属性。 stateStyles stateStyl…

微信报修小程序源码

源码获取方式&#xff1a; 1、搜一搜 万能工具箱合集 然后点击资料库&#xff0c;即可获取资源 一、先看Demo&#xff08;已更新至4.0.0&#xff09; 想看界面图片的&#xff0c;辛苦你爬一下楼&#xff0c;点击下方查看资源&#xff0c;进入官方demo 二、功能介绍 1、当前版…

二路归并排序的算法设计和复杂度分析and周记

数据结构实验报告 实验目的: 通过本次实验&#xff0c;了解算法复杂度的分析方法&#xff0c;掌握递归算法时间复杂度的递推计算过程。 实验内容&#xff1a; 二路归并排序的算法设计和复杂度分析 实验过程&#xff1a; 1.算法设计 第一步&#xff0c;首先要将数组进行…

计算机网络-第3章 数据链路层

主要内容&#xff1a;两个信道及对应的协议&#xff1a;点对点信道和广播信道&#xff0c;扩展以太网和高速以太网 本章的分组转发为局域网内的转发&#xff0c;不经过路由&#xff0c;网络层分组转为为网络与网络之间的转发&#xff0c;经过路由。局域网属于网络链路层的范围…

苹果群控功能解析与代码分享!

随着移动互联网的飞速发展&#xff0c;智能设备日益普及&#xff0c;苹果设备因其出色的用户体验和稳定的性能受到了广大用户的喜爱&#xff0c;然而&#xff0c;对于开发者而言&#xff0c;如何有效地管理和控制大量的苹果设备成为了一个亟待解决的问题。 一、苹果群控功能概…

00. Nginx总结-错误汇总

/www/wangmingqu/index.html" is forbidden (13: Permission denied) 错误图片 错误日志 2024/01/09 22:26:27 [error] 1737#1737: *1 "/www/wangmingqu/index.html" is forbidden (13: Permission denied), client: 192.169.1.101, server: www.wangmingqu.c…

回收小程序开发,降低企业成本,提高回收利润

近年来&#xff0c;人们的回收意识逐渐强烈&#xff0c;废品回收行业发展非常迅猛&#xff0c;促进了我国的资源回收再利用&#xff0c;我国回收行业也将迎来新的发展机遇。 随着市场规模的扩大&#xff0c;回收行业也正在逐步进行创新。在互联网的支持下&#xff0c;行业中也…
最新文章