当前位置: 首页 > news >正文

网络编程(8.14)TCP并发服务器模型

作业:
1. 多线程中的newfd,能否修改成全局,不行,为什么?
2. 多线程中分支线程的newfd能否不另存,直接用指针间接访问主线程中的newfd,不行,为什么?
多线程并发服务器模型原代码:

#include<stdio.h>
#include<head.h>
#include<netinet/in.h>
#define PROT 1112
#define IP "192.168.125.133"
void handler(int sig)
{while(waitpid(-1,NULL,WNOHANG)>0);
}
struct climsg
{int nfd;struct sockaddr_in cin;};
void* deal_cli_msg(void *arg);
int main(int argc, const char *argv[])
{//捕获17信号if(signal(17,handler)==SIG_ERR){   ERR_MSG("signal");return -1; }   //创建流式套接字int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){   ERR_MSG("socket");return -1; }   printf("sfd=%d\n",sfd);//设置允许端口被快速复用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){   ERR_MSG("setsockopt");return -1; }   printf("允许端口快速复用成功\n");//绑定服务器的IP和端口--->必须绑定struct sockaddr_in sin;sin.sin_family      = AF_INET;//必须填AF_INETsin.sin_port        = htons(PROT);//端口号:1024~49151sin.sin_addr.s_addr = inet_addr(IP);//本机IPif(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){   ERR_MSG("bind");return -1; }   printf("绑定成功\n");//将套接字设置为被动监听状态if(listen(sfd,128)<0){   ERR_MSG("listen");return -1; }   printf("被动监听状态设置成功\n");//从已完成连接的队列中获取一个客户端信息,生成一个新的文件描述符struct sockaddr_in cin;//存储客户端地址信息socklen_t addrlen = sizeof(cin);pthread_t tid;int nfd=-1;struct climsg info;while(1){   nfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(nfd<0){ERR_MSG("accept");return -1; }printf("[%s:%d]nfd=%d,客户端连接成功\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),nfd);info.nfd=nfd;info.cin=cin;//该文件描述符才是客户端通信的文件描述符if(pthread_create(&tid,NULL,deal_cli_msg,(void *)&info)!=0){printf("pthread_create failed __%d__\n",__LINE__);return -1; }}   close(sfd);return 0;
}
void* deal_cli_msg(void *arg)
{char buf[128]="";ssize_t res=0;int nfd =((struct climsg*) arg)->nfd;struct sockaddr_in cin =((struct climsg*) arg)->cin;while(1){   bzero(buf,sizeof(buf));//接受数据res=recv(nfd,buf,sizeof(buf),0);if(res<0){ERR_MSG("recv");break;}else if(0==res){printf("[%s:%d]nfd=%d 客户端下线\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),nfd);break;}printf("nfd=%d : %s\n",nfd,buf);//发送数据strcat(buf,"*_*");if(send(nfd,buf,sizeof(buf),0)<0){ERR_MSG("send");break;}printf("发送成功\n");}close(nfd);return 0;                                                                                                                                                                                                                                                                                                                                                                                                                                                           
} 

1.将newfd改成全局变量效果:

 答:不行,因为newfd是全局变量的话,客户端连接后生成的新的文件描述符会一直覆盖上一次保存的文件描述符,导致客户端下线时只能关闭最新创建的文件描述符,无法关闭之前客户端连接时创建的文件描述符。

2.不保存分支线程的newfd,直接用指针间接访问主线程中的newfd效果:

与第一题效果相同,不保存nfd时有客户端创建连接会一直覆盖结构体里的文件描述符nfd的数据,导致断开连接时关闭的文件描述符nfd取的是结构体里最新的 ,导致之前创建连接时开启的文件描述符没有被保存导致无法关闭。

3.基于UDP的TFTP文件传输

TFTP通信过程总结

  1. 服务器在69号端口等待客户端的请求
  2. 服务器若批准此请求,则使用 临时端口 与客户端进行通信。
  3. 每个数据包的编号都有变化(从1开始)
  4. 每个数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的数据包或ACK包
  5. 数据长度以512Byte传输的,小于512Byte的数据意味着数据传输结束。

 

 下载代码:

#include<stdio.h>
#include<head.h>
#define PORT 69
int main(int argc, const char *argv[])
{char IP[128]="";printf("请输入IP:\n");scanf("%s",IP);char name[128]="";printf("请输入文件名:\n");scanf("%s",name);//创建报式套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){   ERR_MSG("socket");return -1; }   printf("sfd=%d\n",sfd);//填充客户端自身的地址信息结构体,真实的地址信息结构体根据地址族指定//AF_INET : man 7 ip;                                                                                                                                                                                                                                                                                                                                                                                                                                               struct sockaddr_in sin;sin.sin_family      = AF_INET;//必须填AF_INETsin.sin_port        = htons(PORT);//服务器端口号:1024~49151sin.sin_addr.s_addr = inet_addr(IP);//服务器IP ifconfig查看ssize_t res=0;struct sockaddr_in rcvaddr;socklen_t addrlen = sizeof(rcvaddr);char data[516]="";//数据包char ACK[4]="";//ACK包size_t i=4;char *p=data;short *p1=(short*)data;*p1=htons(1);char *p2=data+2;strcpy(p2,name);char *p3=p2+strlen(p2)+1;strcpy(p3,"octet");//发送读写请求if(sendto(sfd,p,(i+strlen(p2)+strlen(p3)),0,(struct sockaddr*)&sin,sizeof(sin))<0){   ERR_MSG("sendto");return -1; }   bzero(data,sizeof(data));int fp=open(name,O_WRONLY|O_CREAT|O_TRUNC,0664);while(1){   //接收数据res=recvfrom(sfd,data,sizeof(data),0,(struct sockaddr*)&rcvaddr,&addrlen);if(res<0){   ERR_MSG("recvfrom");return -1; }   if(write(fp,data+4,res-4)<0){   ERR_MSG("write");close(fp);return -1; }   if(res<516){   printf("传输完毕\n");break;}//发送数据short *m1=(short *)ACK;*m1=htons(4);short *m2=m1+1;*m2=*((short *)data+1);if(sendto(sfd,ACK,i,0,(struct sockaddr*)&rcvaddr,sizeof(rcvaddr))<0){ERR_MSG("sendto");return -1; }bzero(data,sizeof(data));bzero(ACK,sizeof(ACK));}   //关闭文件描述符close(sfd);close(fp);return 0;
} 

上传代码:

相关文章:

网络编程(8.14)TCP并发服务器模型

作业&#xff1a; 1. 多线程中的newfd&#xff0c;能否修改成全局&#xff0c;不行&#xff0c;为什么&#xff1f; 2. 多线程中分支线程的newfd能否不另存&#xff0c;直接用指针间接访问主线程中的newfd,不行&#xff0c;为什么&#xff1f; 多线程并发服务器模型原代码&…...

认识负载均衡||WEBSHELL

目录 一、负载均衡 1.nginx负载均衡算法 2.nginx反向代理-负载均衡 二、webshell 1.构造不含数字和字母的webshell 2.如何绕过 一、负载均衡 1.nginx负载均衡算法 &#xff08;1&#xff09;轮询&#xff08;默认&#xff09;每个请求按时间顺序逐一分配到不同的后端服务&…...

Chapter 15: Object-Oriented Programming | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Object-oriented programmingManaging larger programsGetting startedUsing objectsStarting with programsSubdividing a problemOur first Python objectClasses as typesObject lifecycleMultiple instancesInheritanceSummaryGlossa…...

模板编程-成员特化

成员特化:类模板特化除了可以对整个类进行特化外,可以只针对某部分成员函数进行特化 全类特化和成员特化都属于全局特化 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring>template<typename T> class CMath { public:CMath(const…...

信安通用基础知识

文章目录 密码学经典误区PGP优良保密协议信安经典其它安全手段XSS与CSRF cross site request forgeryCSRF的利用逻辑CSRF示例CSRF防范检查Referer字段添加校验token XSS cross site scripting common weakness enumeration常见密码api误用&#xff08;摘自毕设参考文献&#xf…...

网上购物系统的设计与实现/在线商城/基于spring boot的电商平台/基于Java的商品销售系统

摘 要 本毕业设计的内容是设计并且实现一个基于Springboot的网上购物系统。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;Tomcat网络信息服务作为应用服务器。网上购物系统的功能已基本实现&#xff0c;主要包括用户管理、数码分类管理、数码产品管理、服…...

uniapp项目-配置store文件夹

1.创建store.js 说明&#xff1a;创建一个新的 Vuex Store 实例&#xff0c;配置 Store 中的模块。 import Vue from vue; import Vuex from vuex; // 导入两个 Vuex 模块&#xff1a;moduleCart 和 moduleUser import moduleCart from /store/cart.js; import moduleUser fr…...

element表格多选实现

表格实现多选 实现表格多选很简单&#xff0c;只需要在表格里加上一列即可&#xff0c;加完之后就会在表格里出现一列白色的四方块按钮&#xff0c;可以多选&#xff0c;也可以单选 <el-table-columntype"selection"width"55"align"center"&…...

宠物智能自动喂食器方案设计

据相关数据表明&#xff0c;2019年全国城镇宠物犬猫数量达到9915万只&#xff0c;增幅达到8.4%&#xff0c;消费市场规模达2024亿元&#xff0c;比2018年增长18.5%&#xff0c;整体呈现持续大幅增长的态势。而养宠人群的主力&#xff0c;为25岁至38岁年轻人&#xff0c;都市白领…...

学习笔记230818---对于promise失败状态处理的重要性

问题描述&#xff1a; 在项目中经常会出现如上的问题&#xff0c;这是因为&#xff0c;用promise封装的接口或第三方组件方法&#xff0c;如果只对成功的状态做处理&#xff0c;就会造成页面出错&#xff0c;报error。 解决方法 then()的末尾加上.catch(()>{})对失败的状态…...

【Redis】什么是缓存击穿,如何预防缓存击穿?

【Redis】什么是缓存击穿&#xff0c;如何预防缓存击穿&#xff1f; 缓存击穿是指一个 Key 非常热点&#xff0c;大并发集中对这一个点进行访问&#xff0c;当这个Key 在失效的瞬间&#xff0c;持续的大并发就会穿破缓存&#xff0c;直接请求数据库。缓存击穿和缓存雪崩的区别…...

Android 13.0 强制app横屏显示

1.概述 在13.0产品定制化开发中,对于处理屏幕旋转方向,首先有kernel底层处理,从底层驱动gsensor 中获取数据,从而判断屏幕方向的,然后事件上报后 最后由WMS就是WindowManagerService 来处理旋转的相关事件 2.强制app横屏显示的核心类 /framework/base/services/java/com…...

平方数之和(力扣)双指针 JAVA

给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 a&#xff3e;2 b&#xff3e;2 c 。 示例 1&#xff1a; 输入&#xff1a;c 5 输出&#xff1a;true 解释&#xff1a;1 * 1 2 * 2 5 示例 2&#xff1a; 输入&#xff1a;c 3 输出&am…...

深入浅出Pytorch函数——torch.nn.init.sparse_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

OpenCV实现BGR2BayerGB/BG格式的转换

1、说明 OpenCV没有提供从BGR生成Bayer格式的接口,需要自己写 OpenCV定义为4种格式,分别为: BGGR排列 -> RG格式 RGGB排列 -> BG格式 GRBG排列 -> GB格式 GBRG排列 -> GR格式 2、转换 void CUtils::BGR2BayerGB(const cv::Mat &matSrc, cv::Mat &matDst)…...

Gateway网关路由以及predicates用法(项目中使用场景)

1.Gatewaynacos整合微服务 服务注册在nacos上&#xff0c;通过Gateway路由网关配置统一路由访问 这里主要通过yml方式说明&#xff1a; route: config: #type:database nacos yml data-type: yml group: DEFAULT_GROUP data-id: jeecg-gateway-router 配置路由&#xff1a;…...

深入浅出Pytorch函数——torch.nn.init.constant_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

centos mysql8解决Access denied for user ‘root‘@‘localhost‘ (using password: YES)

环境 系统&#xff1a;CentOS Stream release 9 mysql版本&#xff1a;mysql Ver 8.0.34 for Linux on x86_64 问题 mysql登录提示 Access denied for user rootlocalhost (using password: YES)解决方法 编辑 /etc/my.cnf &#xff0c;在[mysqld] 部分最后添加一行 skip-…...

Docker实战:Docker常用命令

一、镜像相关 1.1、查看镜像 docker images1.2、拉取镜像 docker pull nginx1.3、保存镜像 docker save -o nginx.tar nginx:latest1.4、移除镜像 docker rmi -f nginx:latest1.5、导入镜像 docker load -i nginx.tar二、容器相关 2.1、启动容器 docker run --name red…...

基于51单片机直流电机转速数码管显示控制系统

一、系统方案 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法。本文中采用了三极管组成了PWM信号的驱动系统&#xff0c;并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节&#xff0c;从而控制其输入信号波形等…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...