网络编程 0904作业

作业

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

多进程并发服务器

多进程服务器 PIDserver.c 代码

#include <myhead.h>
#define SERPORT 7777
#define SERIP "192.168.19.128"
#define BACKLOG 10void 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.mzph.cn/web/52035.shtml

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

相关文章

【MySQL进阶之路】数据库的操作

目录 创建数据库 字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定字符集和校验规则 在配置文件中配置 查看数据库 显示创建语句 修改数据库 删除数据库 数据库的备份和恢复 备份整个数据库 备份特定表 备份多个数据库 备份所有数据…

编译可执行命令的FFmpeg

上一篇讲到了使用FFmpeg生成视频封面图&#xff0c;其实也可以直接使用FFmpeg相关命令截取一帧的图像数据保存到本地&#xff0c;然后加载到ImageView上&#xff0c;有时候使用命令确实比写代码更加简单和使人轻松一点&#xff0c;所以这一篇是讲解如何导入FFmpeg相关源码 然后…

ChatGPT3.5/4.0新手使用手册,国内中文版使用教程

引言 欢迎使用ChatGPT&#xff01;无论你是刚开始接触AI聊天机器人&#xff0c;还是已经有了一些使用经验&#xff0c;这篇新手使用手册将帮助你快速上手&#xff0c;并且从ChatGPT中获得最优的体验。本文主要聚焦于提示词&#xff08;Prompt&#xff09;的使用教学&#xff0…

Spring 源码解读:实现Spring容器的初始化与刷新机制

引言 在Spring框架中&#xff0c;容器的初始化和刷新机制是其核心工作流程的重要部分&#xff0c;它负责加载Bean定义、创建Bean实例、进行依赖注入并管理整个Bean的生命周期。在实际开发中&#xff0c;ApplicationContext提供的refresh()方法扮演着关键角色&#xff0c;它帮助…

C++系列-STL容器之list

STL容器之list list容器的基本结构list容器的特点list容器的优点list容器的缺点 list容器的构造函数list容器的常用接口list赋值操作list大小及空否list访问list迭代器相关list增删查改push and popinsert其它 寄扬州韩绰判官 杜牧〔唐代〕 青山隐隐水迢迢&#xff0c;秋尽江南…

vant 动态查询下拉菜单(可用)

动态查询item项 <van-form submit"onSubmit" ref"formRef"><Title title"企业信息" title-line title-size"19" class"ml-[18px] mb-[18px]"></Title><van-cell-group inset class"py-[18px]&quo…

Python实战项目:天气数据爬取+数据可视化(完整代码)_python爬虫实战

一、选题的背景 随着人们对天气的关注逐渐增加&#xff0c;天气预报数据的获取与可视化成为了当今的热门话题&#xff0c;天气预报我们每天都会关注&#xff0c;天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

Linux——网络(5)

一、sqlite3性能测试 1. 程序效率测试 时间相关接口&#xff1a; int gettimeofday(struct timeval*tv, struct timezone *tz); 功能&#xff1a;得到从1970年1月1日0时0分0秒到现在的秒数 精度到微妙 参数&#xff1a; tv&#xff1a;…

什么是视频缓存服务器,它有哪些作用?

视频缓存服务器通常拥有大容量的存储空间和高速的读写能力&#xff0c;它通过缓存(即临时存储)用户经常访问的视频内容&#xff0c;来优化内容的分发过程。这种服务器通常部署在网络中的关键位置&#xff0c;如靠近用户接入点的位置&#xff0c;以降低用户访问视频内容时的网络…

维信小程序禁止截屏/录屏

一、维信小程序禁止截屏/录屏 //录屏截屏,禁用wx.setVisualEffectOnCapture({visualEffect:hidden});wx.setVisualEffectOnCapture(Object object) 测试安卓手机&#xff1a; 用户截屏&#xff0c;被禁用 用户录屏&#xff0c;录制的是空白内容/黑色内容的视频。 二、微信小…

鸿蒙系统为什么能安装安卓的APP

鸿蒙系统能够安装安卓的APP&#xff0c;主要得益于其设计理念和技术实现上的几个关键点&#xff1a; 一、设计理念 鸿蒙系统的设计初衷并非完全取代安卓系统&#xff0c;而是与其共存&#xff0c;并建立一个更加广泛的软件生态圈。这一理念体现在鸿蒙系统对安卓应用的兼容性上…

浙大数据结构:01-复杂度2 Maximum Subsequence Sum

数据结构MOOC PTA习题 01-复杂度2 Maximum Subsequence Sum #include <iostream> using namespace std; const int M 100005; int a[M]; int main() {int k;cin >> k;int f 1;for (int i 0; i < k; i){cin >> a[i];if (a[i] > 0)//如果出现大于0则…

【HuggingFace Transformers】OpenAIGPTModel源码解析

OpenAIGPTModel源码解析 1. GPT 介绍2. OpenAIGPTModel类 源码解析 说到ChatGPT&#xff0c;大家可能都使用过吧。2022年&#xff0c;ChatGPT的推出引发了广泛的关注和讨论。这款对话生成模型不仅具备了强大的语言理解和生成能力&#xff0c;还能进行非常自然的对话&#xff0c…

1.初识ChatGPT:AI聊天机器人的革命(1/10)

引言 在当今的数字化世界中&#xff0c;人工智能&#xff08;AI&#xff09;正以其独特的方式重塑我们的生活和工作。其中&#xff0c;AI聊天机器人作为人机交互的前沿技术&#xff0c;已经成为企业与客户沟通、提供个性化服务的重要工具。这些机器人通过模拟人类的对话方式&a…

二、MMRotate旋转框目标检测训练DOTA数据集(模型推理与部署,保存推理结果为xml文件并构建镜像)

在上一篇文章中介绍了MMRotate的概述、安装和训练Dota数据集全流程,由于文章篇幅限制还剩下一部分模型的推理和部署环节没有写,为避免后续对这部分工作的遗忘,决定还是补充上这部分的笔记,仅作记录,如有不足之处还请指出! 一、模型推理测试 1.1单张图片推理测试 可以首…

DataSet和DataTable的关系

C#中的DataTable 在C#中&#xff0c;DataTable 是 System.Data 命名空间下的一个类&#xff0c;它是 DataSet 的一个组件&#xff0c;用于存储表格形式的数据。DataTable 可以独立于数据库使用&#xff0c;也可以与数据库表相关联&#xff0c;用于数据的读取、更新、插入和删除…

LeetCode 热题100-17 缺失的第一个正数

缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 [1,…

OpenCV绘图函数(13)绘制多边形函数函数polylines()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 画几条多边形曲线 函数原型 void cv::polylines (InputOutputArray img,InputArrayOfArrays pts,bool isClosed,const Scalar & color…

【高等代数笔记】(18)N阶行列式

2. N阶行列式 2.12 行列式按k行&#xff08;列&#xff09;展开 【拉普拉斯定理】 n n n阶矩阵 A ( a i j ) \boldsymbol{A}(a_{ij}) A(aij​)&#xff0c;取定第 i 1 , i 2 , . . . , i k i_{1},i_{2},...,i_{k} i1​,i2​,...,ik​行&#xff08;其中 i 1 < i 2 < .…

将x减到零的最小操作数问题

欢迎跳转我的主页&#xff1a;羑悻的小杀马特-CSDN博客 目录 一题目简述&#xff1a; 二题目思路&#xff1a; 三解答代码&#xff1a; 一题目简述&#xff1a; leetcode题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二题目思路&#xff1a; 首先这道题…