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

C++——NetWork

1.network.h

#include <iostream>
#include <winsock2.h>
#include <cstring>class NetWork 
{int type;           // 通信协议类型int sock_fd;        // socket 描述符sockaddr_in addr; // 通信地址int addrlen;  // 通信地址字节数bool issvr;         // 是否是服务器// 关闭 socket 套接字并释放内存
public:NetWork(void);NetWork(int type,  const char* ip, short port, bool issvr=false);~NetWork(void);bool open(void);// 等待连接,只有TCP协议的服务器才能调用NetWork* accept_nw(void);// 具备 send 和 sendto 的功能int send_nw(const char*buf,int flag = 0);int send_nw(const void* buf, size_t len,int flag = 0);// 具备 recv 和 recvfrom 的功能int recv_nw(void* buf, size_t len,int flag = 0);};

 2.network.cpp

#include "network.h"
#include <iostream>
#include <stdexcept>NetWork::NetWork(void)
{addrlen = sizeof(addr);type = SOCK_STREAM;issvr = false;
}NetWork::NetWork(int type, const char* ip,short port, bool issvr):type(type),issvr(issvr)
{   //不在构造函数中创建socket,因为socket创建可能失败,而构造函数是没有返回值的,不能在此创建// 初始化地址结构体addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip);addrlen = sizeof(addr);
}NetWork::~NetWork(void) 
{closesocket(sock_fd);
}bool NetWork::open(void)
{//创建socket对象sock_fd = socket(AF_INET,type,0);if(sock_fd < 0){perror("socket");return false;}//根据type和issvr执行以下流程if (issvr) {// 服务器端绑定和监听if (bind(sock_fd, (sockaddr*)&addr, addrlen)) {perror("bind");return false;}     if (type == SOCK_STREAM && listen(sock_fd, 50)){perror("listen");return false;}}else if (type == SOCK_STREAM && connect(sock_fd,(sockaddr*)&addr,addrlen)) {perror("connect");return false;}return true;
}NetWork* NetWork::accept_nw() 
{if (type != SOCK_STREAM || !issvr) {puts("只有type为SOCK_STREAM 且为服务端才能调用该函数\n");}NetWork* nw = new NetWork;nw->sock_fd = accept(sock_fd, (sockaddr*)&nw->addr, &nw->addrlen);if (nw->sock_fd < 0) {delete nw;perror("accept");return NULL;}return nw;
}int NetWork::send_nw(const char* buf,int flag )
{if(type == SOCK_STREAM)return ::send(sock_fd,buf,strlen(buf)+1,flag);elsereturn sendto(sock_fd,buf,strlen(buf)+1,flag,(sockaddr*)&addr,addrlen);
}int NetWork::send_nw(const void* buf, size_t len,int flag )
{if (type == SOCK_DGRAM) {return sendto(sock_fd, (char*)buf, len, flag, (sockaddr*)&addr, addrlen);} else {return send(sock_fd,(char*)buf, len, flag);}
}int NetWork::recv_nw(void* buf, size_t len,int flag ) 
{if (type == SOCK_DGRAM) {return recvfrom(sock_fd, (char*)buf, len, flag, (sockaddr*)&addr, &addrlen);} else {return recv(sock_fd, (char*)buf, len, flag);}
}

NetWork已经封装好了下面来使用

server.cpp

#include "network.h"
#include <Windows.h>
#include <pthread.h>
#include <cstdlib>
#include <cstring>using namespace std;#define buf_size (4096)
void* server(void* arg)
{NetWork* cnw = static_cast<NetWork*>(arg);char* buf = new char[buf_size];for (;;){//接收请求int ret = cnw->recv_nw(buf, buf_size);if (ret <= 0 || 0 == strcmp("quit", buf)){printf("客户端%d退出\n", cnw);delete cnw;delete buf;return NULL;}printf(" recv:%s bits:%d\n",  buf, ret);//响应请求strcat(buf, "::return");ret = cnw->send_nw(buf);if (ret <= 0){printf("客户端退出\n");delete cnw;delete buf;return NULL;}}//关闭pthread_exit(NULL);}int main(int argc,const char * argv[])
{if(argc!=3){printf("参数格式输入错误:./server + ip + port\n");return 0;}NetWork * snw = new NetWork(SOCK_STREAM,argv[1],atoi(argv[2]),true);if(!snw->open()){delete snw;return -1;}for(;;){NetWork * cnw = snw->accept_nw();if(cnw ==NULL){continue;}pthread_t tid;pthread_create(&tid, NULL, server, (void*)cnw);// 分离线程,让线程结束后自动回收资源pthread_detach(tid);}}

client.cpp:不要需要开多线程,服务器开多线程因为,服务器要处理多用户发来的请求

#include "network.h"
#include <Windows.h>
#include <pthread.h>
#include <cstdlib>
#include <cstring>using namespace std;#define buf_size (4096)int main(int argc,const char * argv[])
{if(argc!=3){printf("参数格式输入错误:./server + ip + port\n");return 0;}NetWork * cnw = new NetWork(SOCK_STREAM,argv[1],atoi(argv[2]));if(!cnw->open()){delete cnw;return -1;}char* buf = new char[buf_size];for (;;){cout<< "<<<"<<endl;cin.getline(buf, buf_size);//发送请求int   ret = cnw->send_nw(buf);if (ret <= 0){printf("客户端退出\n");delete cnw;delete buf;return 0;}//接收请求ret = cnw->recv_nw(buf, buf_size);if (ret <= 0 || 0 == strcmp("quit", buf)){printf("客户端%d退出\n", cnw);delete cnw;delete buf;return 0;}printf(" recv:%s bits:%d\n",  buf, ret);}//关闭}

相关文章:

C++——NetWork

1.network.h #include <iostream> #include <winsock2.h> #include <cstring>class NetWork {int type; // 通信协议类型int sock_fd; // socket 描述符sockaddr_in addr; // 通信地址int addrlen; // 通信地址字节数bool issvr; …...

iOS -- 代码优化

目录 1. filter 优化2. return 优化案例1案例2 3. for循环优化案例1案例2 4. 枚举 优化5. 未完待续…… 1. filter 优化 原代码 if var vcs vcs {for vc in vcs {if vc is XXLoginViewController {if let index vcs.firstIndex(of: vc) {vcs.remove(at: index)}} }修改后 v…...

docker配置普通用户访问

文章目录 &#x1f315;方法一&#xff1a;让所有用户都可以使用docker&#x1f319;创建docker用户组&#x1f319;把当前用户加入docker用户组&#x1f319;单独把某个用户加入docker用户组&#x1f319;更新激活docker用户组&#x1f319;验证不需要sudo执行docker命令&…...

php后端学习,Java转php

遇到前后端跨域 php解决跨域问题可以加上下面的代码&#xff1a; header(“Access-Control-Allow-Origin:*”); 并且查看自己的数据库信息是否连接成功。 从Java转php 个人感受php跟偏向前端&#xff0c; 写后端逻辑时没有像java又springboot工具方便。 但是和前端联调很方便…...

Elasticsearch 中管道介绍

Elasticsearch 中管道 文章目录 Elasticsearch 中管道1、管道( Ingest Pipeline)1.**管道描述**2.**处理器(Processors)**(1)**`attachment`处理器**(2)**`remove`处理器**3.**整体流程**4.**应用场景**示例:如何使用该管道总结2、如何设置`attachment`处理器取出`指定…...

将jinjia2后端传到前端的字典数据转化为json

后端代码 from flask import Flask, render_template, jsonifyapp Flask(__name__)app.route(/) def index():data {key: value, number: 123}return render_template(index.html, datadata)if __name__ __main__:app.run(debugTrue) 前端代码 使用tojson过滤器即可 <!…...

Linux中如何理解一切皆文件

根据之前的学习我们会有一些少许的疑惑&#xff0c;我们的stdin &#xff0c;stdout&#xff0c;stderr访问的是键盘显示器&#xff0c;然而键盘显示器等他们都有一个共同的特点就是他们都是外设&#xff0c;那么这些外设是怎么被看成是文件的呢&#xff1f; 看图可以知道硬件的…...

【贪心算法】(第十一篇)

目录 坏了的计算器&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 合并区间&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 坏了的计算器&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;Leet…...

React(五) 受控组件和非受控组件; 获取表单元素的值。高阶组件(重点),Portals; Fragment组件;严格模式StrictMode

文章目录 一、受控组件1. 什么是受控组件2. 收集input框内容3. 收集checkBox的值4. 下拉框select总结 二、非受控组件三、高阶组件1. 高阶组件的概念 (回顾高阶函数)2. 高阶组件应用&#xff1a;注入props(1) 高阶组件给---函数式组件注入props(2) 高阶组件给---类组件注入prop…...

深入解析 Jenkins 自动化任务链:三大方法实现任务间依赖与状态控制

文章目录 前言1. 使用 “Build Trigger”&#xff08;构建触发器&#xff09;2. 使用 Jenkins Pipeline 实现任务触发3. 使用 Jenkins 的 “Parameterized Trigger Plugin” 插件例子1&#xff1a;任务 A 成功后自动执行任务 B例子2&#xff1a;任务 A 成功后自动执行 Pipeline…...

无人机飞手执照培训为什么需要脱产学习?

无人机飞手执照培训需要脱产学习的原因主要基于以下几个方面&#xff1a; 一、知识体系的系统性与复杂性 无人机飞手培训涵盖的内容广泛且深入&#xff0c;包括无人机基础知识、飞行原理、气象学、法律法规等多个方面。这些知识体系相互关联&#xff0c;需要学员进行系统的学…...

PostgreSQL(十三)pgcrypto 扩展实现 AES、PGP 加密,并自定义存储过程

目录 一、pgcrypto 简介1.1 安装 pgcrypto 扩展1.2 pgcrypto 包含的函数 二、用法①&#xff1a;对称加密&#xff08;使用 AES、Blowfish 算法&#xff09;2.1 密钥2.2 密钥偏移量 三、用法②&#xff1a;PGP加解密3.1 什么是PGP算法&#xff1f;3.2 使用 GPG 生成密钥对3.3 列…...

uniapp使用webView打开的网页有缓存如何解决(APP,微信小程序)

1、给webView的url增加时间戳 this.webviewUrl ${url}?t${new Date().getTime()}; // 添加时间戳 2、在nginx服务器上添加响应头&#xff0c;告诉浏览器不可以使用缓存 location / {root /opt/webs/lcdp-client/dist;index index.html index.htm;try_files $uri $uri/ /…...

HarmonyOS 模块化设计

1.HarmonyOS 模块化设计 模块化设计文档   应用程序包开发与使用文档 1.1. 概述 组件化一直是移动端比较流行的开发方式&#xff0c;有着编译运行快&#xff0c;业务逻辑分明&#xff0c;任务划分清晰等优点&#xff0c;HarmonyOs组件化的使用&#xff0c;有利于模块之间的解…...

解决docker拉取readeck镜像报Error response from daemon: toomanyrequests问题

readeck 是一个内容中心&#xff0c;目前已支持中文翻译 这是本地化部署后的效果&#xff1a; 原命令为&#xff1a; docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest Unable to find image codeberg.org/readeck/readeck:la…...

duilib的应用 在双屏异分辨率的显示器上 运行显示不出来

背景&#xff1a;win11&#xff0c;duilib应用&#xff0c;双显示器&#xff0c;两台分辨率相同&#xff0c;分别设置不同的缩放以后&#xff0c;应用运行以后&#xff0c;程序闪一下消失或者程序还在&#xff0c;但是UI显示不出来。 原因 窗口风格设置不合理&#xff0c;所以…...

零代码快速开发智能体 |甘肃旅游通

在互联网信息爆炸的时代&#xff0c;寻找一处让人心动的旅游胜地往往需要花费大量的时间和精力。而今天&#xff0c;我要向大家介绍一款能够帮助你轻松规划甘肃之行的智能体——“甘肃旅游通”。这款智能体通过低代码开发&#xff0c;集合了丰富的旅游信息和个性化推荐功能&…...

【MATLAB源码-第187期】基于matlab的人工蜂群优化算法(ABC)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Artificial Bee Colony&#xff08;ABC&#xff09;算法是一种模仿蜜蜂觅食行为的优化算法&#xff0c;它通过模拟蜜蜂群体的社会结构和行为来解决数学优化问题。本文将详细介绍ABC算法的基本原理、算法流程、以及在实际应用…...

qt获取本地语言

获取本地语言 #define QSTRING_TO_UTF8(str) std::string(str.toUtf8()) enum LanguageType {kLanguageTypeChinese,kLanguageTypeTradition,kLanguageTypeEnglish };QLocale qlLanguage;QString qstrLangCode qlLanguage.languageToString(qlLanguage.language());LOG(INFO)…...

【Spring篇】Spring中的Bean管理

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;Spring IOC容器 &#x1f6a…...

面试回答第十五问:类加载

类加载简介 类加载是JVM能够识别类信息&#xff0c;分配空间创建对象实例的基础。 类加载一共分为五阶段&#xff0c;分别是加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化五阶段。这不是顺序&#xff0c;不是加载之后才能验证&#xff0c;验证之后才…...

保姆级教程:用YOLOv8+PyQt5打造你的番茄成熟度检测桌面应用(附完整源码与数据集)

从零构建番茄成熟度检测桌面应用&#xff1a;YOLOv8与PyQt5深度整合实战 在农业智能化浪潮中&#xff0c;计算机视觉技术正逐步改变传统农业生产方式。以番茄种植为例&#xff0c;成熟度判断直接影响采摘效率和经济效益。本文将带您完整实现一个结合YOLOv8目标检测与PyQt5图形界…...

AudioLDM-S与LangGraph:构建音效生成工作流引擎

AudioLDM-S与LangGraph&#xff1a;构建音效生成工作流引擎 1. 引言 想象一下这样的场景&#xff1a;电影制作人需要为一场雨夜追逐戏配乐&#xff0c;传统的工作流程需要先搜索音效库&#xff0c;筛选合适的雨声、脚步声、轮胎摩擦声&#xff0c;然后进行剪辑、混音&#xf…...

SDMatte与LSTM时序模型结合:处理视频连续帧的稳定抠图

SDMatte与LSTM时序模型结合&#xff1a;处理视频连续帧的稳定抠图 1. 引言&#xff1a;视频抠图的挑战与机遇 视频抠图技术一直是影视后期和直播领域的核心需求。传统方法在处理动态场景时常常面临边缘闪烁、细节丢失和时间不一致等问题。想象一下&#xff0c;当你在视频会议…...

从需求到SQL:手把手教你将‘住院管理系统’的ER图转化为可运行的数据表(附建表语句)

从需求到SQL&#xff1a;住院管理系统数据库设计实战指南 在医疗信息化快速发展的今天&#xff0c;一套设计良好的住院管理系统数据库不仅能提高医院运营效率&#xff0c;更能为患者提供更精准的医疗服务。本文将带你从零开始&#xff0c;完整实现一个住院病人信息管理系统的数…...

xarray 实战指南 - 从数据操作到科学计算

1. 为什么你需要xarray&#xff1f; 第一次接触科学计算时&#xff0c;我用的是NumPy和Pandas。那时候处理气象数据&#xff0c;经常要手动管理维度、坐标和属性&#xff0c;一个简单的时空平均操作要写好几行代码。直到发现了xarray&#xff0c;才明白原来数据处理可以这么优雅…...

变压器差动保护MATLAB/simulink仿真 变压器差动保护仿真➕报告

变压器差动保护MATLAB/simulink仿真 变压器差动保护仿真➕报告第一部分&#xff1a;Simulink 仿真模型搭建指南 以下是变压器差动保护的Simulink模型搭建步骤及核心代码&#xff0c;包含模型参数设置、差动逻辑实现和仿真分析&#xff1a; 一、Simulink模型搭建 打开MATLAB&…...

不止是上网:用PVE虚拟的OpenWRT旁路由解锁Docker、AdGuard Home和异地组网玩法

解锁PVE虚拟OpenWRT旁路由的进阶玩法&#xff1a;从Docker到智能家居中枢 在家庭网络架构中&#xff0c;OpenWRT旁路由早已超越了简单的网关转发角色。当它运行在PVE虚拟化环境中时&#xff0c;这个轻量级Linux系统&#xff08;仅需1G内存&#xff09;可以变身为多功能家庭网络…...

Typora风格技术文档创作:集成SenseVoice-Small实现语音速记

Typora风格技术文档创作&#xff1a;集成SenseVoice-Small实现语音速记 每次在Typora里敲代码、写文档&#xff0c;是不是都有过这样的瞬间&#xff1f;脑子里灵光一闪&#xff0c;一段绝妙的思路或者一个关键的描述&#xff0c;手速却跟不上。等你好不容易敲完几个字&#xf…...

Java面试高频:阿里真实面试题——Redis分布式锁实现(3分钟速通,不会直接挂)

一、真实面试场景&#xff08;代入感拉满&#xff09; 上周&#xff0c;一个候选人来面试阿里P6。 技术面已经过了两轮&#xff0c;表现都不错。 最后一轮&#xff0c;面试官只问了一个问题&#xff1a; “你们项目里用过Redis分布式锁吗&#xff1f;怎么实现的&#xff1f;…...