1.5.C++项目:仿muduo库实现并发服务器之socket模块的设计

项目完整版在:

一、socket模块:套接字模块

在这里插入图片描述

二、提供的功能

Socket模块是对套接字操作封装的一个模块,主要实现的socket的各项操作。

socket 模块:套接字的功能
创建套接字
绑定地址信息
开始监听
向服务器发起连接
获取新连接
接受数据
发送数据
关闭套接字
创建一个监听链接
创建一个客户端连接
设置套接字选项——开启地址端口重用!
设置套接字阻塞属性——设置为非阻塞!

三、实现思想

(一)功能

对socket套接字的操作进行封装。

(二)意义

对socket套接字的操作进行封装。

(三)功能设计

  1. 创建套接字
  2. 绑定地址信息
  3. 开始监听
  4. 向服务器发起连接
  5. 获取新连接
  6. 接受数据
  7. 发送数据
  8. 关闭套接字
  9. 创建一个监听链接
  10. 创建一个客户端连接

四、代码

#define MAX_LISTEN 1024
class Socket {private:int _sockfd;public:Socket() :_sockfd(-1) {}Socket(int fd) : _sockfd(fd) {} ~Socket() {Close(); }int fd() {return _sockfd;}// 1.创建套接字bool Create() {//int socket (int domain,int type,int protocol);_sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (_sockfd < 0) {ERR_LOG("CREATE SOCKET FAILED !!");return false;}return true;} // 2.绑定地址信息bool Bind(const std::string &ip,uint16_t port) {struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip.c_str());socklen_t len = sizeof(struct sockaddr_in);// int bind(int sockfd,struct sockaddr * addr,socklen_t len);int ret = bind(_sockfd,(struct sockaddr*)&addr,len);if (ret < 0) {ERR_LOG("BIND ADDRESS FAILED!!!!");return false;}return true;}// 3.开始监听bool Listen(int backlog = MAX_LISTEN) {// int listen(int backlog)int ret = listen(_sockfd,backlog);if (ret < 0) {ERR_LOG("SOCKET LISTEN FAILED!!");return false;}return true;}// 4. 向服务器发起连接bool Connect(const std:: string& ip,uint16_t port) {struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip.c_str());socklen_t len = sizeof(struct sockaddr_in);// int bind(int sockfd,struct sockaddr * addr,socklen_t len);int ret = connect(_sockfd,(struct sockaddr*)&addr,len);if (ret < 0) {ERR_LOG("CONNECT ADDRESS FAILED!!!!");return false;}return true;} // 5. 获取新连接int Accept() {// int accept(int sockfd,struct sockaddr* addr,socklen_t *len) /int newfd = accept(_sockfd,NULL,NULL);if (newfd < 0) {ERR_LOG("SOCKET ACCEPT FAILED!!!!");return false;}return newfd;}ssize_t Recv(void *buf,size_t len,int flag = 0){// 6.接收数据//有符号长整型 //ssize_t Recv(int sockfd,void* buf,size_t len,int flag);ssize_t ret = recv(_sockfd,buf,len,flag);if (ret <= 0) {// EAGAIN 当前socket的接收缓冲区没有数据来,在非阻塞二点情况下才会有这个错误// ENTER 当前socket的阻塞等待,被信号打断了if (errno == EAGAIN || errno == EINTR) {return 0; // 没收到数据}ERR_LOG("SOCKET RECV FAILED!!");return -1; // 出错}return ret;}ssize_t nonBlockRecv(void* buf,size_t len) {return Recv(buf,len,MSG_DONTWAIT); // MSG_DONTWAIT 表示当前接受为非阻塞}// 7.发送数据ssize_t Send(const void* buf,size_t len,int flag = 0) {// ssize_t send(int sockfd,void *data,size_t len,int flag) ssize_t ret = send(_sockfd,buf,len,flag);if (ret < 0) {ERR_LOG("SOCKET SEND FAILED!!");return -1; // 出错}return ret; // 实际发送数据长度!!}ssize_t nonBlockSend(void* buf,size_t len) {return Send(buf,len,MSG_DONTWAIT); // MSG_DONTWAIT 表示当前接受为非阻塞}// 8.关闭套接字void Close() {if (_sockfd != -1) {close(_sockfd);_sockfd = -1;}}// 9.创建一个服务端链接bool createServer(uint16_t port, const std::string &ip = "0.0.0.0", bool block_flag = false) {// 1.创建套接字 2. 绑定地址 3.开始监听 4.设置非阻塞 5.启动地址重用if (Create() == false) return false;if (Bind(ip,port) == false) return false;if (Listen() == false) return false;if (block_flag) NonBlock();ReuseAddress();return true;}// 10.创建一个客户端链接 bool createClient(uint16_t port, const std::string &ip) {if (Create() == false) return false;if (Connect(ip,port) == false) return false;return true;}// 11. 设置套接字选项——开启地址端口重用!void ReuseAddress() {// int setsockopt(int fd,int leve,int optname,void *val,int vallen)int val = 1;setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (void*)&val, sizeof(int));val = 1;setsockopt(_sockfd, SOL_SOCKET, SO_REUSEPORT, (void*)&val, sizeof(int));}// 12. 设置套接字阻塞属性——设置为非阻塞! void NonBlock() {int flag = fcntl(_sockfd, F_GETFL, 0);fcntl(_sockfd, F_SETFL, flag | O_NONBLOCK);}};

五、测试

(一)tcp_cli.cc

#include "../source/server.hpp"int main() {Socket cli_sock;cli_sock.createClient(8500,"127.0.0.1");std::string str = "nihao";cli_sock.Send(str.c_str(),str.size());char buf[1024] = {0};cli_sock.Recv(buf,1023);DBG_LOG("%s",buf);return 0;
}

(二)tcp_srv.cc

#include "../source/server.hpp"int main() {Socket lst_sock;bool ret = lst_sock.createServer(8500);while (1) {int newfd = lst_sock.Accept();if (newfd < 0) {continue;}Socket cli_sock(newfd);char buf[1024] = {0};int ret = cli_sock.Recv(buf,1023);if(ret < 0) {cli_sock.Close();}cli_sock.Send(buf,ret);cli_sock.Close();}lst_sock.Close();return 0;
}

(三)makefile

all:client server
client:tcp_cli.ccg++ -std=c++11 $^ -o $@
server:tcp_srv.ccg++ -std=c++11 $^ -o $@

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/145810.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2023-5129 libwebp堆缓冲区溢出漏洞影响分析

漏洞简述 近日苹果、谷歌、Mozilla和微软等公司积极修复了libwebp组件中的缓冲区溢出漏洞&#xff0c;相关时间线如下&#xff1a; 9月7日&#xff0c;苹果发布紧急更新&#xff0c;修复了此前由多伦多大学公民实验室报告的iMessage 0-click 漏洞&#xff0c;漏洞被认为已经被…

华为云云耀云服务器L实例评测 | 实例场景体验之搭建个人博客:通过华为云云耀云服务器构建个人博客

华为云云耀云服务器L实例评测 &#xff5c; 实例场景体验之搭建个人博客&#xff1a;通过华为云云耀云服务器构建个人博客 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀…

idea Springboot在线商城系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 在线商城系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有 完整的源代码和数据库&…

关于ElementUI之动态树+数据表格+分页实例

目录 一.ElementUI动态树 二.实例 2.1.数据表 2.2.后端 2.3.前端 三.书籍管理 3.1.数据表 3.2.后端 3.2.前端 好啦今天就分享到这了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&#xff01; 一.ElementUI动态树 ElementUI提供了一个动态树组件&#xff08;Dynami…

vscode左键无法跳转到定义的文件

之前用vscode的时候&#xff0c;明明是可以ctrl键鼠标左键跳转到定义文件的&#xff0c;突然之间就不行了&#xff0c;鼠标移到引入上根本都没有下划线&#xff0c;无法跳转 解决方法&#xff1a; 项目的根目录新建 jsconfig.json 文件&#xff0c;代码如下 {"compiler…

使用SDKMAN在Linux系统上安装JDK

本文使用的Linux发行版为Rocky Linux 9.2&#xff0c;可以当做CentOS的平替产品。 SDKMAN是一个sdk包管理工具&#xff0c;通过自带的命令可以快速切换软件环境&#xff0c; 官网地址&#xff1a;https://sdkman.io/。 1、安装sdkman&#xff1a; # curl -s "https://ge…

去雨去雪去雾数据集构建

在进行去雨去雪去雾算法的学习过程中&#xff0c;需要构建去雨去雪去雾数据集&#xff0c;本文参考Learning Multiple Adverse Weather Removal via Two-stage Knowledge Learning and Multi-contrastive Regularization: Toward a Unified Model论文中的数据集设定&#xff0c…

Linux CentOS7 vim重复行

在用vim编辑处理文件时&#xff0c;会有重复行。有的是情境需要&#xff0c;有的可能是误操作而形成。对于正常形成的重复行&#xff0c;我们不作讨论&#xff0c;我们仅讨论什么情况下会出现重复行&#xff0c;如何避免&#xff0c;如何处理。 在文件中的单行或多个连续空白行…

css复合选择器

交集选择器 紧紧挨着 <template><div><p class"btn">Click me</p><button class"btn" ref"myButton" click"handleClick">Click me</button></div> </template> <style> but…

Kotlin异常处理runCatching,getOrNull,onFailure,onSuccess(1)

Kotlin异常处理runCatching&#xff0c;getOrNull&#xff0c;onFailure&#xff0c;onSuccess&#xff08;1&#xff09; fun main(args: Array<String>) {var s1 runCatching {1 / 1}.getOrNull()println(s1) //s11&#xff0c;打印1println("-")var s2 ru…

cesium gltf控制

gltf格式详解 glTF格式本质上是一个JSON文件。这一文件描述了整个3D场景的内容。它包含了对场景结构进行描述的场景图。场景中的3D对象通过场景结点引用网格进行定义。材质定义了3D对象的外观,动画定义了3D对象的变换操作(比如选择、平移操作)。蒙皮定义了3D对象如何进行骨骼…

【2023双非保研】信管跨保计算机大类的记录(东南、川大、重大、东北、西电、南理工、杭高院、河海、东华、天大等)

以此篇博客记录我的保研之旅 目录 一、个人情况 二、夏令营 1、国科大杭高院&#xff08;线下&#xff09; 2、南信工&#xff08;线下&#xff09; 3、华中师范&#xff08;线上or线下&#xff09; 4、浙大软件&#xff08;线上&#xff09; 5、东华大学&#xff08;线…

玩转gpgpu-sim 04记—— __cudaRegisterBinary() of gpgpu-sim 到底做了什么

官方文档&#xff1a; GPGPU-Sim 3.x Manual __cudaRegisterBinary(void*) 被执行到的代码逻辑如下&#xff1a; void** CUDARTAPI __cudaRegisterFatBinary( void *fatCubin ) { #if (CUDART_VERSION < 2010)printf("GPGPU-Sim PTX: ERROR ** this version of GPGPU…

Jenkins集成AppScan实现

一、Jenkins上安装插件 在Jenkins里安装以下插件 ibm-security-appscanstandard-scanner 二、打开AppScan 1、配置需要扫描的地址 配置需要扫描的地址 2、记录好要扫描的URL登录序列 记录好要扫描的URL登录序列 3、导出要扫描的URL登录序列设置 导出要扫描的URL登录序列设置 三…

LeetCode算法题---第2天

注:大佬解答来自LetCode官方题解 80.删除有序数组的重复项Ⅱ 1.题目 2.个人解答 var removeDuplicates function (nums) {let res [];for (let index 0; index < nums.length; index) {let num 0;if (res.includes(nums[index])) {for (let i 0; i < res.length; …

【算法】动态规划

文章目录 概述背包问题01背包问题&#xff1a;代码示例部分背包代码示例 完全背包代码示例 多重背包代码示例 总结提升 概述 动态规划&#xff08;Dynamic Programming&#xff09;是一种通过将问题划分为相互重叠的子问题来解决问题的算法思想。其核心思想是通过保存已经计算…

四、2023.9.30.C++面向对象end.4

文章目录 49、 简述一下什么是常函数&#xff0c;有什么作用&#xff1f;50、 说说什么是虚继承&#xff0c;解决什么问题&#xff0c;如何实现&#xff1f;51、简述一下虚函数和纯虚函数&#xff0c;以及实现原理&#xff1f;52、说说纯虚函数能实例化吗&#xff0c;为什么&am…

华为云云耀云服务器L实例评测|Ubuntu系统MySQL 8.1.0 Innovation压测

文章目录 前言&#x1f4e3; 1.前言概述&#x1f4e3; 2.云服务器性能监控&#x1f4e3; 3.MySQL8.1版本安装✨ 3.1 安装包下载✨ 3.2 解压安装包✨ 3.3 登录验证 &#x1f4e3; 4.ubuntu安装sysbench&#x1f4e3; 5.云服务器压测✨ 5.1 IO测试✨ 5.2 CPU性能测试 &#x1f4e…

uniapp 实现下拉筛选框 二次开发定制

前言 最近又收到了一个需求&#xff0c;需要在uniapp 小程序上做一个下拉筛选框&#xff0c;然后找了一下插件市场&#xff0c;确实有找到&#xff0c;但不过他不支持搜索&#xff0c;于是乎&#xff0c;我就自动动手&#xff0c;进行了二开定制&#xff0c;站在巨人的肩膀上&…

番外3:下载+安装VMware(前期准备)

step1: 查看自己笔记本电脑配置&#xff1b; step2: 下载并安装VMware&#xff08;下载地址www..kkx.net/soft/16841.html&#xff09;这里选择本地普通下载&#xff1b; step3: 安装VMware过程中需要填写密钥&#xff08;本人用的最后一个&#xff09;; #UU54R-FVD91-488PP-7N…