MyWebServer开发日记-socket
打算把 tinyWebServer 重写成跨平台(Windows and Linux)的。
这里首先需要跨平台的 sokcet,主要参考 尹圣雨 的 TCP/IP 网络编程 来着:
代码写的有些笨,欢迎批评:
首先是一个 socket 类,主要封装了 常用操作,通过宏定义分别针对 Linux 和 Windows 处理 :
#ifndef _SOCKET_H_
#define _SOCKET_H_#ifdef _WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#endif#include <cstdio>
#include <cstring>
#include <cstdlib>#include <iostream>
#include <sstream>
#include <exception>
#include <stdexcept>
#include <string>#ifdef _WIN32using socklen_t = int;
#elseusing SOCKET = int; //文件描述符static constexpr int INVALID_SOCKET = -1; static constexpr int SOCKET_ERROR = -1;
#endifclass Socket {public:Socket():Socket(PF_INET,SOCK_STREAM,IPPROTO_TCP){}Socket(int domain, int type, int protocal);Socket(SOCKET socket): m_socket(socket){}~Socket() noexcept;void bind(sockaddr *addr, socklen_t addrlen);void listen(int queueLen= 5);Socket accept(sockaddr *addr, socklen_t *addrlen);void connect(sockaddr *addr, socklen_t len);SOCKET getSocket() { return m_socket; }private:SOCKET m_socket;
};class WinSockMgr {
public:static WinSockMgr *getInstance() {static WinSockMgr instance;return &instance;}
private:WinSockMgr();~WinSockMgr() noexcept;
};#endif
这里 WinSockMgr 主要用来管理 WinSock 的一些启动销毁工作。
然后是实现,这里直接报错就抛异常:
#include "socket.h"namespace {
#ifdef _WIN32WinSockMgr* winSockMgr = WinSockMgr::getInstance();
#endif
}std::string getErrorStr(const char *str)
{std::ostringstream errStr;errStr << str << " with errno [" << errno << "]";return errStr.str();
}Socket::Socket(int domain, int type, int protocal) try //这里的 try 纯属多此一举
{m_socket = socket(domain,type,protocal);if (INVALID_SOCKET == m_socket) {std::string errStr = getErrorStr("socket() failed!");std::cerr << errStr << std::endl;throw std::runtime_error(errStr);}
} catch(const std::runtime_error& e) {throw;
}Socket::~Socket()
{
#ifdef _WIN32if (0 != closesocket(m_socket)) {std::cerr << "closesocket() failed!" << std::endl;}
#elseclose(m_socket);
#endif
}void Socket::bind(sockaddr *addr,socklen_t len)
{if (0 != ::bind(m_socket,addr,len)) {std::string errStr = getErrorStr("bind() failed!");std::cerr << errStr << std::endl;throw std::runtime_error(errStr);}
}// queueLen = 5
void Socket::listen(int queueLen)
{// 第二个参数是 请求等待的数量if (0 != ::listen(m_socket,queueLen)) {std::string errStr = getErrorStr("listen() failed!");std::cerr << errStr << std::endl;throw std::runtime_error(errStr);}
}Socket Socket::accept(sockaddr *addr, socklen_t *addrlen)
{SOCKET socket = ::accept(m_socket,addr,addrlen);if (INVALID_SOCKET == socket) {std::string errStr = getErrorStr("accept() failed!");std::cerr << errStr << std::endl;throw std::runtime_error(errStr);}return Socket{socket};
}void Socket::connect(sockaddr *addr, socklen_t addrlen)
{if (SOCKET_ERROR == ::connect(m_socket,addr,addrlen)) {std::string errStr = getErrorStr("connect() failed!");std::cerr << errStr << std::endl;throw std::runtime_error(errStr);}
}WinSockMgr::WinSockMgr() {
#ifdef _WIN32WSADATA wsaData;int ret = WSAStartup(MAKEWORD(2,2),&wsaData);if (ret != 0) {std::string errStr = getErrorStr("WSAStartup() failed!");std::cerr << errStr << "with return: [" << ret << "]" << std::endl;throw std::runtime_error(errStr);}
#endif
}WinSockMgr::~WinSockMgr() {
#ifdef _WIN32if (0 != WSACleanup()) {std::string errStr = getErrorStr("WSACleanup() failed!");std::cerr << errStr << std::endl;}
#endif
}
代码写的不够简洁,还需要修改,但是先这样吧。
主要是简单的封装,也没啥好讲的。
相关文章:
MyWebServer开发日记-socket
打算把 tinyWebServer 重写成跨平台(Windows and Linux)的。 这里首先需要跨平台的 sokcet,主要参考 尹圣雨 的 TCP/IP 网络编程 来着: 代码写的有些笨,欢迎批评: 首先是一个 socket 类,主要…...
图书管理信息系统分析与设计
一、系统开发的可行性分析 (一)系统背景.必要性及意义 随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。随着经济文化水平的显著提高,人…...
Charles基础使用指南
##Charles 基本使用指南 Charles 在本地构建一个HTTP代理服务器,可以实现对HTTP、HTTPS请求的抓取,也就是我们常说的抓包,以及对请求响应的修改等。 Charles 官网地址 https://www.charlesproxy.com/ ###一、移动端的抓包实现 1. PC端开启…...
Android12之/proc/pid/status参数含义(一百六十五)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes
文章目录 🟥 项目基础配置🟧 给UMA配置默认服饰Recipes🟨 设置服饰Recipes属性🟥 项目基础配置 将 UMA_DCS 预制体放到场景中创建空物体,添加DynamicCharacterAvatar 脚本,选择 HumanMaleDCS作为我们的基本模型配置默认Animator 🟧 给UMA配置默认服饰Recipes 服饰Re…...
uniapp-小程序登录授权框
微信官方文档 不弹出授权框原因 因为版本问题,目前的最新的版本是不支持 wx.getUserInfo 去主动弹出授权框 只能引导用户去点击 butten 去授权 解决方法 我的思路是参考了其他的微信微信小程序, 就是跳转到我的页面的时候 在钩子函数内去触发一个封装的模态框,状…...
Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法
Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法 点击封面跳转下载页面 简介 Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法 在Unity开发中,性能优化是一个非常重要的方面。一个常见…...
第一百四十一回 如何添加程序启动页
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了如何解决BLE包中的错误的内容,本章回中将介绍如何添加程序启动页.闲话休提,让我们一起Talk Flutter吧。 概念介绍 程序启动页就是点击手机桌面上的程序启动图标后显示的页面,也叫s…...
从零开始的PICO教程(4)--- UI界面绘制与响应事件
从零开始的PICO教程(4)— UI界面绘制与响应事件 文章目录 从零开始的PICO教程(4)--- UI界面绘制与响应事件一、前言1、大纲2、教程示例 二、具体步骤1、PICO VR环境配置2、XR的UI Canvas画布创建与调整(1)C…...
IntelliJ IDEA 远程调试 Tomcat
准备工作 明确远程服务器的 IP 地址,比如我是:192.168.92.128 关掉服务器防火墙:service iptables stop 本地 Remote Server 配置 添加 Remote Server,如下图 复制 Remote Server 自动生成的 JVM 参数,等下有用&…...
谷粒商城----认证服务
一、短信验证码(阿里云短信服务) Data ConfigurationProperties(prefix "spring.cloud.alicloud.sms") Component public class SmsComponent {private String host;private String path;private String skin;private String sign;private S…...
Mediasoup源码介绍
一、Mediasoup 整体结构 整个Mediasoup库通过Nodejs管理,比如整体逻辑、worker、router、producer、consumer...都是通过JS进行管理的。 其底层的数据传输是通过C部分进行控制的,通过NodeJs来控制C部分,以实现整体的数据传输效 二、Mediasou…...
GIS入门,WKT格式详解
WKT介绍 WKT是Well-known Text的缩写,它是一种用于描述地理空间几何对象的文本格式。 WKT是一种开放的国际标准,由Open Geospatial Consortium(OGC)定义和维护。 WKT是一种标准的表示方法,可以用来描述点、线、面等地理空间对象的形状和位置。通过使用一系列的坐标点和关…...
Qt之postEvent
基本介绍 postEvent方法所属类为QCoreApplication,完整声明如下: [static] void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority Qt::NormalEventPriority) 该方法的作用是将要发送的事件推送到对应线程的事件队列中&…...
1976~2020年青藏高原典型冰川及冰湖遥感监测数据集
冰川面积是反应气候变化最直接的指标之一。在全球变暖的大背景下,对于评估冰川融化造成的生态、全球气候变化和水资源价值评价等问题十分重要。本文针对受西风和印度洋夏季风影响下的青藏高原冰川及其末端冰湖的变化特征,制作了近44年来时相相对连续的冰…...
时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来
时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来 目录 时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现LSSVM时间序列预测未来(最小二乘支持向量机); 2.运行环境Mat…...
windows10 使用WSL2安装原生docker
1.升级WSL2 我的 win10 wsl默认版本是1,先要升级WSL2不然不支持systemd(后台守护进程) 双击直接安装就行,安装包网上都能找到: Microsoft.WSL_1.3.17.0_x64_ARM64.msixbundle 执行 wsl --version 显示这样成功了: C:\Users\xx>wsl --version WSL …...
jupylab pandas按条件批量处理xls数据
批量处理xls表数据 引入相关包 import pandas as pd import xlrd import numpy as np# 去掉jupyleb警告 import warnings warnings.filterwarnings("ignore")from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity…...
RJ45水晶头网线顺序出错排查
线序 网线水晶头RJ45常用的线序标准ANSI / TIA-568定义了T568A与T568B两种线序,一般使用T568B,水晶头8个孔对应的8条线颜色如下图: 那1至8的编号,是从水晶头哪一面为参考呢,如下图,是水晶头金手指一面&am…...
【洛谷 P1115】最大子段和 题解(贪心算法)
最大子段和 题目描述 给出一个长度为 n n n 的序列 a a a,选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数,表示序列的长度 n n n。 第二行有 n n n 个整数,第 i i i 个整数表示序列的第 i i i 个数字 a i …...
深度测试在2D渲染中的性能优化实践
1. 深度测试在2D渲染中的创新应用在移动设备上,2D应用和游戏的渲染性能优化一直是个棘手的问题。传统2D渲染采用简单的后向前(back-to-front)绘制顺序来处理透明混合,这种方法虽然直观,但存在严重的过度绘制࿰…...
taotoken api key管理与访问控制保障企业开发安全
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken API Key 管理与访问控制:保障企业开发安全 在团队协作开发中,安全、可控地使用大模型能力是技术负…...
告别英文恐惧症!PowerToys-CN让Windows效率工具真正为你所用
告别英文恐惧症!PowerToys-CN让Windows效率工具真正为你所用 【免费下载链接】PowerToys-CN PowerToys Simplified Chinese Translation 微软增强工具箱 自制汉化 项目地址: https://gitcode.com/gh_mirrors/po/PowerToys-CN 你是否曾经面对微软官方的PowerT…...
键盘连击问题终极解决方案:免费开源工具KeyboardChatterBlocker完全指南
键盘连击问题终极解决方案:免费开源工具KeyboardChatterBlocker完全指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 还在…...
从零到一:DPDK高性能网络开发实战指南
1. 为什么你需要了解DPDK? 如果你正在开发需要处理高吞吐量网络数据的应用,比如视频流服务器、金融交易系统或者云计算平台,传统的Linux网络栈可能会成为性能瓶颈。我亲身经历过一个项目,用传统方式开发的网关每秒只能处理30万包…...
百度网盘macOS插件:技术探索与速度优化方案解析
百度网盘macOS插件:技术探索与速度优化方案解析 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 在macOS平台上使用百度网盘的用户常常面临下…...
从劝退到离不开:Vim新手入门实战博客(附高效技巧)
文章目录前言💙一、vim是什么?💜二、为什么要学习vim?💚三、vim总览💔四、vim的基本操作4.1vim正常模式命令集(命令模式)4.2vim底行模式命令集4.3vim视图模式💗五、一些小技巧💖六、…...
2025届毕业生推荐的六大AI科研网站实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 一款专为院校学子以及初级科研工作者所设计的AI开题报告工具,它聚焦于开题环节的…...
为什么你的Windows任务栏需要一次彻底的美学革命?
为什么你的Windows任务栏需要一次彻底的美学革命? 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否曾经盯着Windows桌面…...
在Serv00共享主机上部署SOCKS5代理:原理、部署与优化指南
1. 项目概述与核心价值最近在折腾一些需要稳定网络连接的自托管服务时,遇到了一个经典难题:如何在资源受限的共享主机环境里,搭建一个轻量、稳定且可控的网络代理通道。这让我想起了之前在社区里看到的一个项目——cmliu/socks5-for-serv00。…...
