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 …...
Easy-Scraper:Rust 构建的现代化网页数据采集解决方案
Easy-Scraper:Rust 构建的现代化网页数据采集解决方案 【免费下载链接】easy-scraper Easy scraping library 项目地址: https://gitcode.com/gh_mirrors/ea/easy-scraper 在数据驱动决策的时代,网页数据采集已成为企业获取市场情报、研究人员收集…...
MoMask终极指南:5分钟学会AI生成3D人体运动动画
MoMask终极指南:5分钟学会AI生成3D人体运动动画 【免费下载链接】momask-codes Official implementation of "MoMask: Generative Masked Modeling of 3D Human Motions (CVPR2024)" 项目地址: https://gitcode.com/gh_mirrors/mo/momask-codes 想…...
零基础入门:用eNSP搭建USG5500防火墙IPsec虚拟专用网实验环境
从零构建企业级安全隧道:eNSP模拟USG5500防火墙IPsec实战指南 当你第一次听说"IPsec"这个词时,可能会联想到那些科技电影中黑客们建立的加密通道。实际上,IPsec技术离我们并不遥远——它正默默保护着每天数以亿计的企业数据传输。本…...
AI写教材必备!高效工具生成低查重教材,节省大量时间
AI教材生成工具评测与介绍 在编写教材前,选择合适的工具简直是一场“挣扎”的过程!如果用普通的办公软件,功能就显得太简单,框架和格式都需要自己一一调整;若选用专门的AI教材写作工具,操作却显得复杂&…...
让老Mac重获新生的魔法:OpenCore Legacy Patcher如何持续守护你的设备
让老Mac重获新生的魔法:OpenCore Legacy Patcher如何持续守护你的设备 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否曾为那台陪伴多年的Mac设备感到惋…...
GLM-OCR场景应用:教育资料数字化、商务文档信息抽取实战
GLM-OCR场景应用:教育资料数字化、商务文档信息抽取实战 1. 引言:文档智能化的时代需求 在信息爆炸的今天,我们每天都要处理大量纸质文档和电子文件。教育机构需要将历年试卷数字化归档,企业财务部门要处理堆积如山的发票和合同…...
Unity URDF导入终极指南:3步快速实现机器人仿真
Unity URDF导入终极指南:3步快速实现机器人仿真 【免费下载链接】URDF-Importer URDF importer 项目地址: https://gitcode.com/gh_mirrors/ur/URDF-Importer Unity URDF Importer是Unity Robotics官方推出的机器人模型导入工具,它能够让你在Unit…...
Zotero插件Ethereal Style:打造高效文献管理新体验
Zotero插件Ethereal Style:打造高效文献管理新体验 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址: ht…...
巨有科技:银发文旅风口来了!康养旅游这样做才赚
随着老龄化社会加深与全民健康意识提升,康养旅游成为2026年文旅行业最具潜力的风口赛道,银发旅游群体持续壮大,成为文旅市场核心增量。但当下康养旅游普遍存在产品单一、服务不专业、运营不规范、适配性不足等问题,传统观光式旅游…...
别再为版本兼容头疼了!手把手教你搞定Matlab R2014b与NI VeriStand的联合仿真环境
别再为版本兼容头疼了!手把手教你搞定Matlab R2014b与NI VeriStand的联合仿真环境 在硬件在环(HIL)测试领域,Matlab与NI VeriStand的联合仿真环境搭建是许多工程师的必经之路。然而,版本兼容性问题常常成为拦路虎&…...
