网络编程 0904作业

news2024/11/15 8:34:01

作业

1、多进程多线程并发服务器,再实现一遍(重点模型)

多进程并发服务器

多进程服务器 PIDserver.c 代码

#include <myhead.h>
#define SERPORT 7777
#define SERIP "192.168.19.128"
#define BACKLOG 10

void hande(int sss)
{
	if(sss==SIGCHLD)
	{
		while(waitpid(-1,NULL,WNOHANG)!=-1);
	}//回收僵尸进程
}

int main(int argc, const char *argv[])
{
	if(signal(SIGCHLD,hande)==SIG_ERR)//捕获子进程退出的信号
	{
		perror("signal");
		return -1;
	}

	//1、创建原始套接字
	int oldfd = socket(AF_INET,SOCK_STREAM,0);
	if(oldfd ==-1)
	{
		perror("socket");
		return -1;
	}

	//端口号快速复用
	int kkk=666;
	if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&kkk,sizeof(kkk))==-1)
	{
		printf("setsockopt");
		return -1;
	}
	printf("端口快速复用成功\n");

	struct sockaddr_in sin = {
		.sin_family = AF_INET,
		.sin_port = htons(SERPORT),
		.sin_addr.s_addr = inet_addr(SERIP)
	};

	//2、绑定
	if(bind(oldfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
	{
		perror("bind");
		return -1;
	}

	//3、监听
	if(listen(oldfd,BACKLOG)==-1)
	{
		perror("listen");
		return -1;
	}
	//创建子进程,父进程负责接收客户端请求,子进程负责数据收发
	struct sockaddr_in cin;
	int cinlen = sizeof(cin);

	while(1)
	{
		int newfd = accept(oldfd,(struct sockaddr *)&cin,&cinlen);
		if(newfd==-1)
		{
			perror("accept");
			return -1;
		}
		printf("newfd = %d\n",newfd);
		printf("%s:%d连接成功\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
		pid_t pid = fork();//创建子进程
		if(pid>0)//父进程
		{
			//close(newfd);//关闭文件描述符
		}
		else if(pid==0)//子进程
		{
			close(oldfd);//关闭旧的文件描述符
			char buff[1024];
			while(1)
			{
				int len = recv(newfd,buff,sizeof(buff),0);
				if(len==0)
				{
					printf("客户端退出\n");
					break;
				}
				printf("服务器收到信息:%s\n",buff);
				strcat(buff,"^_^");
				send(newfd,buff,sizeof(buff),0);
				printf("发送成功\n");
			}
			//close(newfd);//关闭新的文件描述符
			exit(0);//退出子进程
		}
		else{
			perror("fork");
			return -1;
		}
	}
	close(oldfd);
	return 0;
}

多进程客户端 clinet.c 代码

#include <myhead.h>

#define CLIPORT 7777
#define CLIIP "192.168.19.128"
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_STREAM,0);//1、创建原始套节字
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2、bind可选


	//3、连接服务器
	struct sockaddr_in cin = {
		.sin_family = AF_INET,//IPV4通信
		.sin_port = htons(CLIPORT),//端口号转为网络字节序
		.sin_addr.s_addr = inet_addr(CLIIP)//IP地址转为网络字节序
	};

	if(connect(oldfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
	{
		perror("connect");
		return -1;
	}
	printf("连接服务器成功\n");
	char buff[1024] = "";
	while(1)//4、收发消息
	{
		memset(buff,0,sizeof(buff));
		printf("客户端发信息:");
		fgets(buff,sizeof(buff),stdin);
		buff[strlen(buff)-1] = '\0';
		send(oldfd,buff,sizeof(buff),0);//阻塞发送

		recv(oldfd,buff,sizeof(buff),0);//阻塞接收
		printf("收到服务器的消息:%s\n",buff);
	}
	close(oldfd);
	return 0;
}

运行结果:

多线程并发服务器

多线程服务器

#include <myhead.h>
#define SERPORT 6666
#define SERIP "192.168.19.128"
#define BACKLOG 20
typedef struct
{
	int newfd;//存储新文件描述符
	struct sockaddr_in cin;//存储客户端信息
}HMY;

void *fun1(void *sss)
{
	int newfd = ((HMY *)sss)->newfd;
	struct sockaddr_in cin = ((HMY *)sss)->cin;//解析客户端信息
	char buff[1024];
	while(1)
	{
		bzero(buff,sizeof(buff));
		int len = recv(newfd,buff,sizeof(buff),0);
		printf("收到%s:%d的信息:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buff);//输出客户端信息
		if(len==0)
		{
			printf("客户端退出\n");
			break;
		}
		strcat(buff,"hongmingyuan");//回个信息
		send(newfd,buff,sizeof(buff),0);
		printf("发送成功\n");
	}
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	int oldfd = socket(AF_INET,SOCK_STREAM,0);//1、创建套接字
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	int atao = 8;
	if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&atao,sizeof(atao))==-1)
	{
		perror("setsockopt");
		return -1;
	}
	printf("端口号快速复用成功\n");
	struct sockaddr_in sin = {
		.sin_family  =AF_INET,
		.sin_port = htons(SERPORT),
		.sin_addr.s_addr = inet_addr(SERIP)
	};
	if(bind(oldfd,(struct sockaddr *)&sin,sizeof(sin))==-1)//2、绑定
	{
		perror("bind");
		return -1;
	}
	if(listen(oldfd,BACKLOG)==-1)//3、监听成功
	{
		perror("listen");
		return -1;
	}
	printf("监听成功\n");
	struct sockaddr_in cin;
	int cinlen = sizeof(cin);

	HMY MSG;//定义子线程函数的参数
	while(1)
	{
		//accept接收客户端请求
		int newfd = accept(oldfd,(struct sockaddr *)&cin,&cinlen);
		if(newfd==-1)
		{
			perror("accept");
			return -1;
		}
		printf("%s:%d发来请求\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
		MSG.newfd = newfd;
		MSG.cin = cin;
		//创建子线程与客户端通信
		pthread_t tid;
		if(pthread_create(&tid,NULL,fun1,&MSG)!=0)
		{
			perror("pthread_create");
			return -1;
		}

		//回收子线程资源
		//pthread_join(tid,NULL);//不能使用join回收子线程资源
		pthread_detach(tid);//挂起由系统回收
	}
	//关闭旧的描述符
	close(oldfd);
	return 0;
}

多线程客户端

#include <myhead.h>

#define CLIPORT 6666
#define CLIIP "192.168.19.128"
int main(int argc, const char *argv[])
{
	//1、创建原始套节字
	int oldfd = socket(AF_INET,SOCK_STREAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2、bind可选


	//3、连接服务器
	struct sockaddr_in cin = {
		.sin_family = AF_INET,//IPV4通信
		.sin_port = htons(CLIPORT),//端口号转为网络字节序
		.sin_addr.s_addr = inet_addr(CLIIP)//IP地址转为网络字节序
	};

	if(connect(oldfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
	{
		perror("connect");
		return -1;
	}
	printf("连接服务器成功\n");

	char buff[1024] = "";
	while(1)//4、收发消息
	{
		memset(buff,0,sizeof(buff));
		printf("客户端发信息:");
		fgets(buff,sizeof(buff),stdin);
		buff[strlen(buff)-1] = '\0';
		send(oldfd,buff,sizeof(buff),0);//阻塞发送

		recv(oldfd,buff,sizeof(buff),0);//阻塞接收
		printf("收到服务器的消息:%s\n",buff);
	}
	close(oldfd);
	return 0;
}

运行结果:

2、广播发送接收端,自己实现一遍(重点模型)

广播发送接收端

发送端UDPsend.c代码

#include <myhead.h>
#define SENDPORT 6666
#define SENDIP "192.168.19.255"//广播IP地址

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

	//2、设置套接字允许广播
	int kkk=2;
	if(setsockopt(oldfd,SOL_SOCKET,SO_BROADCAST,&kkk,sizeof(kkk))==-1)
	{
		perror("setsockopt");
		return -1;
	}
	printf("设置允许广播成功\n");

	struct sockaddr_in send = {
		.sin_family = AF_INET,
		.sin_port = htons(SENDPORT),
		.sin_addr.s_addr = inet_addr(SENDIP)
	};

	struct sockaddr_in ree;
	int reelen = sizeof(ree);
	char buff[1024];

	while(1)//3、发送信息
	{
		bzero(buff,sizeof(buff));
		sleep(2);
		strcat(buff,"5201314");
		sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&send,sizeof(send));
		printf("发送成功\n");
	}
	close(oldfd);//关闭套接字
	return 0;
}

接收端recv.c代码

#include <myhead.h>
#define SENDPORT 6666
#define SENDIP "192.168.19.255"//广播IP地址

int main(int argc, const char *argv[])
{
	//1、创建套接字
	int oldfd = socket(AF_INET,SOCK_DGRAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in ree = {
		.sin_family = AF_INET,
		.sin_port = htons(SENDPORT),
		.sin_addr.s_addr = inet_addr(SENDIP)
	};
	//2、绑定
	if(bind(oldfd,(struct sockaddr *)&ree,sizeof(ree))==-1)
	{
		perror("bind");
		return -1;
	}
	//3、收发消息
	char buff[1024];
	while(1)
	{
		bzero(buff,sizeof(buff));
		recvfrom(oldfd,buff,sizeof(buff),0,NULL,NULL);

		printf("%s\n",buff);
		strcat(buff,"^_^");

		sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&ree,sizeof(ree));
		printf("发送成功\n");
	}
	return 0;
}

运行结果:

知识梳理

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

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

相关文章

【数据结构与算法 | 搜索二叉树篇 力扣篇】力扣530, 501

1. 力扣530&#xff1a;二叉搜索树的最小绝对差 1.1 题目&#xff1a; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,…

【人工智能】Transformers之Pipeline(十五):总结(summarization)

​​​​​​​ 目录 一、引言 二、总结&#xff08;summarization&#xff09; 2.1 概述 2.2 BERT与GPT的结合—BART 2.3 应用场景​​​​​​​ 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 ​​​​​​​ 2.4.3 pipeline返回参…

【MATLAB源码-第260期】基于simulink的OFDM+QPSK系统仿真,采用RS编码经过瑞利信道包含信道估计输出各节点波形图以及星座图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM-QPSK系统是一种广泛应用于现代无线通信中的数字信号处理系统&#xff0c;结合了正交频分复用&#xff08;Orthogonal Frequency Division Multiplexing, OFDM&#xff09;和四相移相键控&#xff08;Quadrature Phase S…

Java字节码文件、组成、详解、分析;jclasslib插件、阿里arthas工具;Java注解

文章目录 一、字节码文件1.1 以正确的方式打开文件1.2 字节码文件的组成1.2.1 基础信息1.2.2 常量池1.2.3 方法 1.3 字节码常用工具1.4 总结 二、Java注解2.1 什么是Java注解2.2 注释和注解Annotation的区别&#xff08;掌握&#xff09;2.3 如何使用注解&#xff08;掌握&…

C语言典型例题61

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目&#xff1a; 习题4.2 一个单位下设三个班组&#xff0c;每个班组人员不固定&#xff0c;需要统计每个班组的平均工资。分别输入3个班组所有职工的工资&#xff0c;当输入-1时&#xff0c;表示输入结束。输出…

常见排序方法详解(图示+方法)

一、插入排序 1.1基本思想 把待排序的记录 按其关键码值的大小逐个插入到一个已经排好序的有序序列中 &#xff0c;直到所有的记录插入完为止&#xff0c;得到 一个新的有序序列。 1.2直接插入排序 当插入第 i(i>1) 个元素时&#xff0c;前面的 array[0],array[1],…,array…

大文件上传vue插件vue-simple-uploader

https://www.cnblogs.com/xiahj/p/vue-simple-uploader.html

springboot-es(elasticsearch)搜索项目

目标界面 html页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>途牛旅游</title><link rel"stylesheet" href"https://a.amap.com/jsapi_demos/static/demo-center/css/d…

windows安装php7.4

windows安装php7.4 1.通过官网下载所需的php版本 首先从PHP官网&#xff08;https://www.php.net/downloads.php&#xff09;或者Windows下的PHP官网&#xff08;http://windows.php.net/download/&#xff09;下载Windows版本的PHP安装包。下载后解压到一个路径下。 2.配…

2024/9/4 Canlink配置介绍与常见故障排查

双击一个站进去配置&#xff0c;如果双击PLC则是PLC往外面发数据&#xff0c;双击伺服&#xff0c;则是伺服往外发数据。 例如我想读伺服的功能吗&#xff1f; 点击伺服的配置 将0b00的地址数据发给PLC&#xff08;D100&#xff09; ,寄存器长度是一个 然后下载程序即可

使用docker安装jenkins,然后使用jenkins本地发版和远程发版

使用docker安装jenkins&#xff0c;然后使用jenkins本地发版和远程发版 1、安装docker 1.安装必要的一些系统工具 sudo yum install docker-ce 2.添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3.更新…

电子行业最全【芯片标签二维码】知识剖析

电子行业最全【芯片标签二维码】知识剖析 本文为辰逸绅士小编原创&#xff0c;未经许可请勿私下复制转载 长 文 预 警 目录 ★01--------前言 ★02--------关于电子元器件协会ECIA ★03--------关于矩阵二维码 3.1--------矩阵二维码 构成 3.2--------矩阵二维码 种类 3.…

【数学分析笔记】第3章第1节 函数极限(3)

3. 函数极限与连续函数 3.1 函数极限 3.1.1 函数极限的性质 【局部有界性】若 lim ⁡ x → x 0 f ( x ) A \lim\limits_{x\to x_{0}}f(x)A x→x0​lim​f(x)A&#xff0c;则 ∃ δ > 0 , ∀ x ( 0 < ∣ x − x 0 ∣ < δ ) : m ≤ f ( x ) ≤ M \exists \delta>…

BUUCTF Crypto wp--RSA1

第一步 查看下载文件 我们发现出现了dp dq&#xff0c;属于dp、dq泄露攻击 上述方程本来是用于在加密中进行快速解密的&#xff0c;但是如果二者发生泄露&#xff0c;就有可能进行对密文的解密。 当我们知道了 dp、 dq、p、q、c,在不知道e的情况下&#xff0c;也可以求解明文。…

社交达人秘籍:巧妙维护你的人脉关系!

在这个人脉为王的时代&#xff0c;微信不仅连接了亲朋好友&#xff0c;更成为了拓展职业网络、深化人际关系的重要平台。如何巧妙地在微信上维护并优化你的人脉关系&#xff0c;成为了每位社交达人必修的功课。今天&#xff0c;就让我们一起探索那些让社交关系更加稳固与活跃的…

【DSP】无法在线仿真无法进入main()函数

DSP无法在线仿真无法进入main()函数 1.问题描述 ​ 接手前人的DSP代码&#xff0c;硬件平台是DSP C6701&#xff0c;软件IDE是CCS 12.3.0。仿真器版本是XDS 560V2。 ​ 在进行在线仿真时&#xff0c;经常出现“伪在线”的情况。简单来说&#xff0c;正常的在线过程&#xff…

使用Python的Elasticsearch客户端 elasticsearch-py 来完成删除现有索引、重新创建索引并测试分词的示例代码

以下是一个使用Python的Elasticsearch客户端 elasticsearch-py 来完成删除现有索引、重新创建索引并测试分词的示例代码 一、安装依赖 pip install elasticsearch二、运行效果 三、程序代码 from elasticsearch import Elasticsearch, NotFoundError# 连接到Elasticsearch es…

基本滤波器响应(低通+高通+带通+带阻)+滤波器的响应特性(阻尼系数+截止频率下降率)

2024-9-4&#xff0c;星期三&#xff0c;20:40&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;多云。又是上班的一天&#xff0c;至于心情为什么多云&#xff0c;是因为女朋友换季感冒了&#xff0c;我有上班回不去&#xff0c;难受&#xff0c;赶紧到周五吧&…

多模态:DetCLIPv3解析

文章目录 前言一、介绍二、方法2. Open vocabulary detector2.1 encoder2.2 decoder 3. Object captioner 三、数据工程1. Auto-annotation data pipeline 四、训练策略五、实验总结 前言 目前多模态目标检测逐渐成为检测领域的主要发力方向&#xff0c;从最初的检测大模型gro…

2024年最新版Ajax+Axios 学习【包含原理、Promise、报文、接口等...】

基础知识 AJAX概念 AJAX概念&#xff1a;是浏览器与服务器进行数据通信的技术。 认识URL 定义&#xff1a;统一资源定位符&#xff0c;简称网址&#xff0c;用于访问网络上的资源。 组成&#xff1a; http协议&#xff1a;超文本传输协议&#xff0c;规定浏览器和服务器之…