day26作业

news2024/11/22 16:49:48

1使用多线程基于TCP协议的并发执行,一个服务器对应多个客户端实现通信实验

#include <myhead.h>
//主线程负责监听客户端连接请求
//子线程负责数据收发
#define IP "192.168.60.77"
#define PORT 5555
#define BACKLOG 10
typedef struct
{
	struct sockaddr_in  client;
	int newfd;
}ZYJ;
void * fun(void *sss)

{
	int newfd=((ZYJ *)sss)->newfd;
	struct sockaddr_in client=((ZYJ*)sss)->client;
	char buff[1024];
	printf("%s发来信息\n",inet_ntoa(client.sin_addr));
	while(1)
	{
		bzero(buff,sizeof(buff));
		int len=recv(newfd,buff,sizeof(buff),0);
		if(len==0)
		{
			printf("客户端退出\n");
		}
		printf("收到消息:%s\n",buff);
		strcat(buff,"-1973");
		send(newfd,buff,sizeof(buff),0);
	}
	pthread_exit(NULL);//线程退出
}
int main(int argc, const char *argv[])
{
	//1.创建套接字
	int oldfd=socket(AF_INET,SOCK_STREAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2.绑定
	struct sockaddr_in server={
		.sin_family=AF_INET,
		.sin_port=htons(PORT),
		.sin_addr.s_addr=inet_addr(IP)
	};
	if(bind(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
	{
		perror("bind");
		return -1;
	}
	//3.监听
	if(listen(oldfd,BACKLOG)==-1)
	{
		perror("listen");
		return -1;
	}
	struct sockaddr_in client;
	socklen_t client_len;
	while(1)
	{
		int newfd=accept(oldfd,(struct sockaddr*)&client,&client_len);
		ZYJ sb;
		sb.newfd=newfd;//结构体成员新描述符
		sb.client=client;//结构体成员客户端信息赋值

		pthread_t tid;
		tid=pthread_create(&tid,NULL,fun,&sb);
		if(tid==-1)
		{
			perror("thread_create");
			return -1;
		}
		pthread_detach(tid);//挂起线程由系统回收资源
	}
	return 0;
}

#include <myhead.h>
#define IP "192.168.60.77"
#define PORT 5555
int main(int argc, const char *argv[])
{
	int oldfd=socket(AF_INET,SOCK_STREAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in server={
		.sin_family=AF_INET,
		.sin_port=htons(PORT),
		.sin_addr.s_addr=inet_addr(IP)
	};
	if(connect(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
	{
		perror("connect");
		return -1;
	
	}
	//3.数据收发
	char buff[1024];
	while(1)
	{
		fgets(buff,sizeof(buff),stdin);
		send(oldfd,buff,sizeof(buff),0);
		int len=recv(oldfd,buff,sizeof(buff),0);
		if(len==0)
		{
			printf("服务器意外退出\n");
			break;
		}
		printf("接受服务器消息:%s\n",buff);
	}
	return 0;
}

在这里插入图片描述

2.将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息

#include <myhead.h>
#define IP "192.168.61.255"
#define PORT 5535
int main(int argc, const char *argv[])
{
	int oldfd=socket(AF_INET,SOCK_DGRAM,0);
	int n=1;
	setsockopt(oldfd,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n));
	printf("允许广播成功\n");
	//绑定
	struct sockaddr_in send={
		.sin_family=AF_INET,
		.sin_port=htons(PORT),
		.sin_addr.s_addr=inet_addr(IP)
	};
	/*
	if(bind(oldfd,(struct sockaddr *)&send,sizeof(send))==-1)
	{
		perror("bind");
		return -1;
	}
	*/
	printf("绑定成功");
	char buff[1024];
	while(1)//信息发送
	{
		bzero(buff,sizeof(buff));
		fgets(buff,sizeof(buff),stdin);
		buff[strlen(buff)-1]='\0';
		sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr*)&send,sizeof(send));
		printf("发送成功\n");
	}
	close(oldfd);
	return 0;
}

#include <myhead.h>
#define IP "192.168.61.255"
#define PORT 9999
int main(int argc, const char *argv[])
{
	int oldfd=socket(AF_INET,SOCK_DGRAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2.填充结构体
	struct sockaddr_in recv={
	.sin_family=AF_INET,
	.sin_port=htons(PORT),
	.sin_addr.s_addr=inet_addr(IP)
	};
	//3.绑定
	if(bind(oldfd,(struct sockaddr*)&recv,sizeof(recv))==-1)
	{
		perror("bind");
		return -1;
	}
	printf("绑定成功\n");
	char buff[1024];
	struct sockaddr_in ajin;
	socklen_t ajin_len=sizeof(ajin);
	while(1)
	{
		recvfrom(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&ajin,&ajin_len);
		printf("接收到了%s的信息:%s\n",inet_ntoa(ajin.sin_addr),buff);
		//strcat(buff,"^_^");
		//sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr*)&recv,sizeof(recv));
		//printf("转发成功\n");
	}
	close(oldfd);
	return 0;
}

在这里插入图片描述

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

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

相关文章

【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!

大家好&#xff0c;欢迎来到程序视点&#xff01;我是小二哥&#xff01; 前言 在VUE项目开发中&#xff0c;一些数据常常被多个组件频繁使用&#xff0c;为了管理和维护这些数据&#xff0c;就出现了状态管理模式。 今天小二哥要给大家推荐的不是VueX&#xff0c;而是称为新…

【机器学习chp6】对数几率回归

推荐文章1&#xff0c;其中解释了负log似然损失等价于交叉熵损失。 【王木头从感知机到神经网络】-CSDN博客 推荐文章2&#xff0c;其中有牛顿法的介绍 【王木头梯度下降法优化】随机梯度下降、牛顿法、动量法、Nesterov、AdaGrad、RMSprop、Adam-CSDN博客 推荐文章3&#…

图像处理实验报告

实验一 图像处理的MATLAB基础 实验目的&#xff1a;熟悉数字图象处理的基本软件工具和操作 实验内容&#xff1a;Matlab应用复习&#xff0c;矩阵产生、操作&#xff1b;矩阵运算以及字符运算。 1.利用增量产生向量[0,2,4,6,8,10]。 2.利用magic(n)函数产生7维魔鬼矩阵A&am…

离散数学---概率, 期望

本文根据 MIT 计算机科学离散数学课程整理&#xff08;Lecture 22 ~ Lecture 24&#xff09;。 1 非负整数期望性质 用 N 表示非负整数集合&#xff0c;R 是 N 上的随机变量&#xff0c;则 R 的期望可以表示成&#xff1a; 证明&#xff1a; 换一个形式&#xff0c;把每一列…

GPU服务器厂家:科研服务器领域机遇与博弈,AMD 新UDNA 架构

科研服务器作为推动科学研究进步的核心基础设施&#xff0c;其性能与架构的创新对于整个科研生态有着极为关键的影响。AMD 全新推出的 UDNA 架构&#xff0c;引发了广泛的关注与讨论。 AMD UDNA 架构于科研服务器的产品数据与市场格局 AMD 在计算机硬件领域的影响力持续攀升&a…

STM32H7开发笔记(2)——H7外设之多路定时器中断

STM32H7开发笔记&#xff08;2&#xff09;——H7外设之多路定时器中断 文章目录 STM32H7开发笔记&#xff08;2&#xff09;——H7外设之多路定时器中断0.引言1.CubeMX配置2.软件编写 0.引言 本文PC端采用Win11STM32CubeMX4.1.0.0Keil5.24.2的配置&#xff0c;硬件使用STM32H…

【Linux】Linux入门实操——定时任务调度

一、crond调度 1. 概述 任务调度: 是指系统在某个时间执行的特定的命令或程序。任务调度分类 1. 系统工作 : 有些重要的工作必须周而复始地执行。如病毒扫描等 2. 用户工作 &#xff1a;用户可能希望执行某些程序&#xff0c;比如对mysql数据库的备份。 2. 基本语法 cron…

找到字符串中所有字母异位词(java)

题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词 示例 1: 输入: s "cbaebabacd", p "abc&…

Leetcode226. 翻转二叉树(HOT100)+Leetcode221. 最大正方形(HOT100)

链接 题解&#xff1a; 本题是要镜像反转二叉树&#xff0c;相当于从中间一分&#xff0c;然后把左子树和右子树对调&#xff0c;但又不是简单的对调&#xff0c;还要继续反转子树的子树&#xff0c;所以要用递归。 我们特判root是否为空&#xff08;否则出现nullptr->nul…

ISUP协议视频平台EasyCVR私有化视频平台新能源汽车充电停车管理方案的创新与实践

在环保意识提升和能源转型的大背景下&#xff0c;新能源汽车作为低碳出行的选择&#xff0c;正在全球迅速推广。但这种快速增长也引发了充电基础设施短缺和停车秩序混乱等挑战&#xff0c;特别是在城市中心和人口密集的居住区&#xff0c;这些问题更加明显。因此&#xff0c;开…

国际知名摄影测量与遥感专家、瑞士苏黎世联邦理工学院终身教授Armin Gruen莅临大势智慧参观交流

11月18日&#xff0c;瑞士苏黎世联邦理工学院终身教授、国际摄影测量与遥感学会荣誉会员、武汉大学测绘遥感信息工程国家重点实验室客座教授Armin Gruen莅临武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;参观交流。大势智慧董事长黄先锋亲自接待了Arm…

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展&#xff0c;流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言&#xff0c;把握这些趋势并积极应对挑战将是实现成功的关键…

C# 数据结构之【树】C#树

以二叉树为例进行演示。二叉树每个节点最多有两个子节点。 1. 新建二叉树节点模型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace DataStructure {class TreeNode{public int Data { get;…

Sqlite: Java使用、sqlite-devel

这里写目录标题 一、简介二、使用1. Java项目中&#xff08;1&#xff09;引入驱动&#xff08;2&#xff09;工具类&#xff08;3&#xff09;调用举例 2. sqlite-devel in linuxsqlite-devel使用 三、更多应用1. 数据类型2. 如何存储日期和时间3. 备份 一、简介 非常轻量级&…

MySQL深入:B+树的演化、索引和索引结构

提示&#xff1a;内容是读《MySQL技术内幕&#xff1a;InnoDB存储引擎》&#xff0c;笔记摘要 文章目录 二叉查找树平衡二叉树(AVL) B树(BTree)B树(BTree)InnoDB B树索引索引结构&#xff08;InnoDB B树&#xff09;B树存放的数据量 二叉查找树 在二叉查找树中&#xff0c;左子…

C语言-11-18笔记

1.C语言数据类型 类型存储大小值范围char1 字节-128 到 127 或 0 到 255unsigned char1 字节0 到 255signed char1 字节-128 到 127int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295short2 字节…

“乐鑫组件注册表”简介

当启动一个新的开发项目时&#xff0c;开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间&#xff0c;还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念&#xff0c;旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号 Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分…

Django一分钟:django中收集关联对象关联数据的方法

场景&#xff1a;我有一个模型&#xff0c;被其它多个模型关联&#xff0c;我配置了CASCADE级联删除&#xff0c;我想要告知用户删除该实例之后&#xff0c;哪些关联数据将会被一同删除。 假设我们当前有这样一组模型&#xff1a; class Warehouse(models.Model):""…