当前位置: 首页 > 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;从而控制其输入信号波形等…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...