网络编程作业day4

news2024/11/20 20:26:20

广播模型:

发送端:

#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.125.255");//广播地址
	//绑定(可选)
	
	//发送广播消息
	char sbuf[1024];
	while(1)
	{
		bzero(sbuf,sizeof(sbuf));
		printf("请输入:");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]='\0';
		//发送消息
		sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		puts("发送成功");
		if(strcmp(sbuf,"end")==0)
		{
			break;
		}
				
	}
	//关闭套接字
	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;
	}
	//填充地址信息结构体
	struct sockaddr_in rin;
	rin.sin_family=AF_INET;
	rin.sin_port=htons(8888);
	rin.sin_addr.s_addr=inet_addr("192.168.125.255");//广播地址
	//绑定
	if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1)
	{
		perror("bind error");
		return -1;
	}
	//接收广播消息
	char rbuf[1024];
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		//读取消息
		recv(rfd,rbuf,sizeof(rbuf),0);
		printf("收到消息:%s\n",rbuf);
		if(strcmp(rbuf,"end")==0)
		{
			break;
		}
				
	}
	//关闭套接字
	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("socket 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[1024];
	while(1)
	{
		printf("请输入:");
		fgets(sbuf,sizeof(sbuf),stdin);
		sbuf[strlen(sbuf)-1]='\0';
		sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		puts("发送成功");
		if(strcmp(sbuf,"end")==0)
		{
			break;
		}
	}
	//关闭套接字
	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;
	}
	//设置加入多播组
	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.125.151");//本地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[1024];
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		//读取消息
		recv(rfd,rbuf,sizeof(rbuf),0);
		printf("收到消息:%s\n",rbuf);
		if(strcmp(rbuf,"end")==0)
		{
			break;
		}
	}
	//关闭套接字
	close(rfd);
	return 0;
}

流式套接字模型:

服务器:

#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;
	}
	if(listen(sfd,128)==-1)
	{
		perror("listen error");
		return -1;
	}
	//客户端地址信息结构体
	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;
	}
	char rbuf[128]="";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		recv(newfd,rbuf,sizeof(rbuf),0);
		printf("[%s]:%s\n",cun.sun_path,rbuf);
		if(strcmp(rbuf,"end")==0)
		{
			break;
		}
		strcat(rbuf,"*_*");
		send(newfd,rbuf,strlen(rbuf),0);
		printf("发送成功\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;
	}
	//判断套接字
	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;
	}
	//服务器地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;
	strcpy(sun.sun_path,"./mysocket");
	//连接客户端
	if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
		perror("connect error");
		return -1;
	}
	//收发数据
	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);
		puts("发送成功");
		if(strcmp(wbuf,"end")==0)
		{
			break;
		}
		bzero(wbuf,sizeof(wbuf));
		recv(cfd,wbuf,sizeof(wbuf),0);
		printf("收到服务器回发的消息是:%s\n",wbuf);
	}
	//关闭套接字
	close(cfd);
	return 0;
}

报式套接字 模型:

服务器:

#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;
	}
	//判断套接字
	if(access("./socket",F_OK)==0)
	{
		//存在该文件,需要删除该文件
		if(unlink("./socket")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}
	//绑定套接字文件
	//服务器端地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;//地址族
	strcpy(sun.sun_path,"./socket");//套接字文件
	if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
		perror("bind error");
		return -1;
	}
	//客户端地址信息结构体
	struct sockaddr_un cun;
	socklen_t socklen=sizeof(cun);
	char rbuf[128]="";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cun,&socklen);
		printf("[%s]:%s\n",cun.sun_path,rbuf);
		if(strcmp(rbuf,"end")==0)
		{
			break;
		}
		strcat(rbuf,"*_*");
		sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cun,socklen);
		printf("发送成功\n");
	}
	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;
	}
	//判断套接字
	if(access("./socket1",F_OK)==0)
	{
		//存在该文件,需要删除该文件
		if(unlink("./socket1")==-1)
		{
			perror("unlink error");
			return -1;
		}
	}
	//绑定套接字文件
	//客户端地址信息结构体
	struct sockaddr_un cun;
	cun.sun_family=AF_UNIX;//地址族
	strcpy(cun.sun_path,"./socket1");//套接字文件
	if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1)
	{
		perror("bind error");
		return -1;
	}
	//服务器地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family=AF_UNIX;
	strcpy(sun.sun_path,"./socket");
	char wbuf[128]="";
	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");
	if(strcmp(wbuf,"end")==0)
		{
			break;
		}
        //接收服务器回复的消息
        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/1491473.html

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

相关文章

蓝桥杯备赛 day2 | 4. 付账问题 5. 数字三角形

付账问题&#xff0c;关键是要了解整型的范围&#xff0c;确定获取输入数据的变量类型 需要注意的是int的十进制范围-32768 ~ 32767&#xff0c;那么我们可以知道&#xff0c;人数n是可以用int来装的&#xff0c;需付款数S应该是long long&#xff0c;获取的每个人初始钱数也应…

自动驾驶预测与决策规划(nuplan数据集)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.概述 2 数据采集 3.开环与闭环仿真 4.数据注释 5.场景 6.规划框架 6.1Train 6.2Simulation 6.3Metric 6.4Visualization 7.下载…

JasperStudio中TextField文本框组件渲染之后,出现行间距不一致的问题

目录 1.1、问题描述 1.2、解决方案 1.1、问题描述 最近在处理线上遇到的一个问题,是有关JasperReports报表相关的问题,问题背景大概是这样的:我们的项目中使用了JasperReports来渲染报表,其中使用到了Text Field文本框组件,但是问题是渲染出来的数据直接会出现一些间距…

JAVA如何利用接口实现多继承问题

hello&#xff0c;上文带大家学习了java中类的继承&#xff0c;我们可以创建一个父类&#xff0c;将类中的共性抽取出来&#xff0c;通过子类继承的方式来实现代码的复用。今天带大家学习不同类之间的另外几种关系&#xff0c;即多态抽象类和接口。 多态的概念 多态&#xff0c…

【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &#x1f680; 本…

Microsoft@ppt@快速掌握核心功能@常用功能培训

文章目录 refs动画动画的用途逐部分显示内容实现问答效果部分地修改页面内容动画效果 常用窗口对象选择窗口&#x1f47a;批量选择对象 如何为重叠的对象高效的命名重命名方式方案1方案2对象重命名原则重命名后如何使用tips 动画窗口&#x1f47a; 幻灯片管理幻灯片母版幻灯片母…

dolphinscheduler海豚调度(四)钉钉告警

在之前的博文中&#xff0c;我们已经介绍了DolphinScheduler海豚调度的基本概念和工作流程&#xff0c;以及Shell任务和SQL任务的实践。今天&#xff0c;让我们来学习DolphinScheduler中的另一个重要功能&#xff1a;钉钉告警。 钉钉群添加机器人 在钉钉群添加机器人&#xf…

使用Redis入门Golang

Golang&#xff0c;也被称为Go&#xff0c;近年来由于其简单性、效率和并发支持而获得了显著的关注。另一方面&#xff0c;Redis是一个强大的内存数据存储&#xff0c;擅长于缓存、会话存储和实时分析。将这两种技术结合起来&#xff0c;可以为各种用例提供可扩展和高效的解决方…

LeetCode 2673. 使二叉树所有路径值相等的最小代价【贪心】1917

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【TEMU】凌风TEMU工具箱介绍,集合智能抢仓、TEMU选品、TEMU监控、TEMU库存管理,本地仓库管理、跨境翻译等功能....

凌风TEMU工具箱介绍 一、安装教程1、下载方式2、环境准备3、安装步骤3.1、插件安装3.2、客户端安装 4、启动软件 二、使用教程一&#xff1a;登录注册激活方法2.1 注册登录2.2 激活方式 &#xff08;激活码激活&#xff09;2.3 绑定店铺 二&#xff1a;使用方法&#xff1a;功能…

Zookeeper:常见的面试题和答案

1、什么是Zookeeper&#xff1f;它的作用是什么&#xff1f; 答&#xff1a; Zookeeper是一个开源的分布式协调服务&#xff0c;提供了一些基本的分布式服务&#xff0c;如配置管理、分布式锁、分布式队列等。其主要作用是帮助分布式应用程序进行协调和管理&#xff0c;确保分…

Crossover24版现已上线!附免费升级攻略 Crossover软件下载使用方法

好久不见啦&#xff0c;最近一直在忙着研究Mac玩游戏&#xff0c;什么幻兽帕鲁、女神异闻录之类的&#xff0c;有些沉迷了&#xff0c;实在对不住大家… 不过今天还是给大家带来了好消息&#xff01;那就是让Mac玩游戏不再是笑话的神器&#xff0c;CodeWeavers公司正式发布了C…

动态规划|【路径问题】|931.下降路径最小和

目录 题目 题目解析 思路 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 代码 题目 931. 下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开…

2024年热门通达信指标合集(财富池)

2024年已经到来&#xff0c;随着市场的波动和变化&#xff0c;投资者们更加关注有效的投资工具。在这个充满机遇和挑战的时刻&#xff0c;了解并掌握最新的通达信指标将成为您赚取财富的关键。本文将深入介绍几款最受欢迎的指标&#xff0c;帮助您更好地理解市场走势&#xff0…

Python 全栈系列232 再次搭建RabbitMQ

说明 最近想重新上RabbitMQ&#xff0c;主要目的还是为了分布式任务调度。在Kafka和RabbitMQ两者犹豫了一下&#xff0c;还是觉得RabbitMQ好一些。 在20年的时候有搞过一阵子的RabbitMQ,看了下当时的几篇文章&#xff0c;觉得其实想法一直没变过。 Python - 装机系列24 消息…

【python】python职业人群体检数据分析(代码+数据)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

python--产品篇--游戏-坦克

文章目录 准备代码main.pycfg.py 效果 准备 下载 代码 main.py import os import cfg import pygame from modules import *主函数 def main(cfg):# 游戏初始化pygame.init()pygame.mixer.init()screen pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))pygame.display.…

仙宫云:细节控ComfyUI AI写实摄影+视频镜像

在使用comfyui工作流时经常遇到插件安装&#xff0c;模型下载的问题&#xff0c;为了方便大家使用和体验comfyui&#xff0c;我在仙宫云上部署了一个云端comfyui镜像包&#xff0c;开放给大家使用。 细节控ComfyUI AI写实摄影视频工作流&#xff1a; 镜像主页&#xff1a;仙宫…

python之双端队列deque

普通队列只能进行队尾插入和出队头的操作&#xff0c;双端队列可以对队头和队尾进行操作&#xff0c;而且相比于list实现的队更具有优越性&#xff0c;list实现在删除和插入时的时间复杂度大约为O(n)&#xff0c;而deque的时间复杂度是O(1) 队头操作&#xff1a;append()、pop(…

三整数排序问题的解题逻辑

【题目描述】 输入3个整数&#xff0c;从小到大排序后输出。 【样例输入】 20 7 33 【样例输出】 7 20 33 【解析】 本题解法大概有3种&#xff1a; 1、穷举条件法。 此方法先判断a、b、c大小的所有可能&#xff0c;再根据各种可能性输出不同的排序。 思路是先判断a、…