Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信

由于,本人是主修java的,所以以下内容可能不是很精通,各位看完后尽可评论。

以下皆是在linux的描述

第一步,通过socket拿到fd

Socket()函数:创建用于通信的端点并返回描述符。

int fd = socket(AF_INET, SOCK_STREAM, 0);

它的第一个参数便是通信域,这里我举出常用的。

AF_INET是ipv4的。

AF_INET6是ipv6的。

它的第二个参数便是套接字具有指定的类型,指定通信语义

套接字类型与协议族所相关。

常用的套接字类型有:

SOCK_STREAM:提供有序的、可靠的、双向的、基于连接的字节流。一种带外数据传输装置
主义可能得到支持。

SOCK_DGRAM:支持数据报(无连接、最大长度固定的不可靠消息)。

看上去是不是感觉就是,一个是tcp,另外一个是udp呢0.0.

它的第三个参数是协议族的标识符。这里的0表示使用默认的协议族。

该协议指定套接字使用的特定协议。通常只存在一个协议来支持
给定协议族中的特定套接字类型,在这种情况下,可以将protocol指定为0。然而,这是可能的
可能存在许多协议,在这种情况下,必须以这种方式指定特定的协议。

第二步,设置套接字选项

getsockopt, setsockopt 函数: get and set options on sockets

    int val = 1;setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
  1. fd:上文拿到的文件描述符。
  2. SOL_SOCKET:这是一个预定义的常量,表示我们要修改的是套接字级别的选项。
  3. SO_REUSEADDR:这是一个预定义的常量,表示我们要修改的是“地址重用”选项。当一个套接字关闭后,操作系统通常会保留该套接字的地址,以便将来重新使用。通过将此选项设置为1,我们可以告诉操作系统在套接字关闭后立即释放其地址,而不是等待一段时间。
  4. &val:这是一个指向整数变量val的指针,该变量的值被设置为1。这是因为setsockopt()函数的最后一个参数需要一个指向整数的指针。
  5. sizeof(val):这是val变量的大小(以字节为单位)。在这种情况下,它是4,因为int通常占用4个字节。

第三步进行bind和listen

// bindstruct sockaddr_in addr = {};addr.sin_family = AF_INET;addr.sin_port = ntohs(1234);addr.sin_addr.s_addr = ntohl(0);    // wildcard address 0.0.0.0int rv = bind(fd, (const sockaddr *)&addr, sizeof(addr));if (rv) {die("bind()");}// listenrv = listen(fd, SOMAXCONN);if (rv) {die("listen()");}

这个sockaddr_in结构体:

linux上是这个:#include <sys/socket.h>

windows上是这个:#include <winsock.h>

struct sockaddr_in {short	sin_family;u_short	sin_port;struct in_addr	sin_addr;char	sin_zero[8];
};

ntohs()函数的作用是:将无符号短整数netshort从网络字节顺序转换为主机字节顺序。

说白了,addr结构体的sin_port字段,表示要绑定的端口号。ntohs函数将主机字节序的端口号转换为网络字节序。在这里,端口号被设置为1234。

ntohl函数将主机字节序的IP地址转换为网络字节序。在这里,IP地址被设置为通配符地址0.0.0.0,表示允许任何IP地址连接到该套接字。

 

int rv = bind(fd, (const sockaddr *)&addr, sizeof(addr));

这行代码调用了bind函数,将套接字fd绑定到指定的网络地址和端口上。bind函数的第一个参数是要绑定的套接字的文件描述符,第二个参数是指向网络地址结构的指针,第三个参数是网络地址结构的大小。在这里,fd是要绑定的套接字的文件描述符,&addr是指向网络地址结构的指针,sizeof(addr)是网络地址结构的大小。

最后,bind函数返回一个整数值,表示操作的结果。

listen(fd, SOMAXCONN); 是调用 listen() 函数,该函数用于使套接字进入监听状态,等待客户端的连接请求。其中,fd 是之前创建的套接字文件描述符,SOMAXCONN 是一个系统定义的最大连接数。

第四步,循环接受并处理请求

  while (true) {// acceptstruct sockaddr_in client_addr = {};socklen_t socklen = sizeof(client_addr);int connfd = accept(fd, (struct sockaddr *)&client_addr, &socklen);if (connfd < 0) {continue;   // error}while (true) {// here the server only serves one client connection at onceint32_t err = one_request(connfd);if (err) {break;}}close(connfd);}

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

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

相关文章

Java药物不良反应ADR智能监测系统源码

药物不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指在使用合格药品时&#xff0c;在正常的用法和用量下出现的与用药目的无关的有害反应。这些反应往往因药物种类、使用方式、个体差异等因素而异&#xff0c;可能导致患者身体不适、病情恶化。 为保…

什么事“网络水军”?他们的违法活动主要有四种形式

我国治理网络水军&#xff0c;包括造谣引流、舆情敲诈、刷量控评、有偿删帖等各类“网络水军”等违法犯罪活动已经许久。 日前&#xff0c;官方召开新闻发布会&#xff0c;公布了相关的一些案件进程&#xff0c;今年已累计侦办相关案件339起&#xff0c;超过历年的全年侦办案件…

创建ESP32开源WiFi MAC(介质访问控制)层

内置WiFi 内置的 WiFi.h 库将使我们能够轻松使用 ESP32 板的 WiFi 功能。 连接到 Wi-Fi 接入点&#xff1a; #include <WiFi.h>const char* ssid "yourNetworkName"; const char* password "yourNetworkPassword";void setup(){Serial.begin(11…

GraalVM 原生镜像支持中文文档

本文为官方文档直译版本。原文链接 GraalVM 原生镜像支持中文文档 引言GraalVM 原生镜像介绍与 JVM 部署的主要区别了解 Spring Ahead-of-Time 处理源代码生成生成提示文件生成代理类 开发您的第一个 GraalVM 原生应用程序应用样本使用构建包构建原生映像系统要求使用 Maven使用…

word press 好用的插件

Custom Post Type UI Filester-File Manager Pro 同样支持在 WordPress 后台编辑、删除、上传、下载、压缩、复制和粘贴文件和文件夹等操作&#xff0c;并且编辑文件时&#xff0c;支持代码高亮显示。 Custom Post Type UI Database Backup for WordPress 按需备份WordPr…

L1-012 计算指数(Java)

题目 真的没骗你&#xff0c;这道才是简单题 —— 对任意给定的不超过 10 的正整数 n&#xff0c;要求你输出 2n。不难吧&#xff1f; 输入格式&#xff1a; 输入在一行中给出一个不超过 10 的正整数 n。 输出格式&#xff1a; 在一行中按照格式 2^n 计算结果 输出 2n 的值。…

深度解析HubSpot数据分析:洞察未来商业趋势

在当今数字化的商业环境中&#xff0c;数据是推动决策和业务增长的关键。作为业内领先的CRM平台&#xff0c;HubSpot不仅为企业提供了高效的客户关系管理工具&#xff0c;同时也成为了数据分析的利器。 1. HubSpot数据分析的核心价值 1.1 洞察客户行为和趋势 HubSpot数据分析…

【打卡】牛客网:BM76 正则表达式匹配

模板的&#xff1a; 关键思想是&#xff1a; 当pattern遇到*时&#xff0c;需要考虑两种情况&#xff1a; str的当前字符和pattern的*前的字符相同&#xff0c;例如str“ab”&#xff0c;pattern“abb*”&#xff0c;“b”和“b*”相同&#xff0c;有两种情况可以选择&#xf…

C语言代码 变种水仙花数

变种水仙花数&#xff1a;把任意的数字从中间拆分成两个数字&#xff0c;如1461可拆分为1和461&#xff1b;14和61&#xff1b;146和1&#xff0c;若所有拆分后的乘积之和等于自身则是一个水仙花数。 14611*461 14*61 146*1 求出5位数中的所有水仙花数。 代码示例&#xf…

MySQL修炼手册1——初探MySQL:连接数据库并执行第一条SQL语句

写在开头 我们将深入学习MySQL的数据库连接和基本SQL语句&#xff0c;通过实际操作演示每个步骤&#xff0c;帮助读者更好地理解和掌握MySQL的基础知识。 1 数据库连接 1.1 连接到不同主机的数据库 连接远程数据库 mysql -h remote_host -u your_username -premote_host: …

【野火i.MX6ULL开发板】在MobaXterm平台利用Type-C线串口连接开发板

0、前言 参考文献&#xff1a; http://t.csdnimg.cn/9iRTm http://t.csdnimg.cn/Z0n60 问题&#xff1a;一直识别不出com口&#xff0c; 拟解决思路&#xff1a; 百度网盘重新下载Debian镜像&#xff0c;烧入full版镜像&#xff0c;随便换一下USB插口&#xff08;电脑主机上…

编程羔手(新手):什么时候用常量,什么时候用枚举类?

静态常量和枚举都是在编程中表示常量的方式&#xff0c;但它们在使用场景和目的上有一些不同。 静态常量&#xff1a; 使用静态常量通常是为了表示一些简单的常量值&#xff0c;例如字符串、数字等。适用于常量值在编译时已知&#xff0c;不需要动态生成的情况。通过静态常量可…

一个大场景下无线通信仿真架构思路(对比omnet与训练靶场)

2020年分析过omnet的源码&#xff0c;读了整整一年&#xff0c;读完之后收获不小&#xff0c;但是也遗憾的发现这个东西只适合实验室做研究的人用于协议的研发与测试&#xff0c;并不适合大场景&#xff08;军事游戏等&#xff09;的应用&#xff0c;因为其固有架构更侧重于每个…

PostGIS学习教程二十:3-D

PostGIS学习教程二十&#xff1a;3-D 注意&#xff1a;本文介绍许多PostGIS2.0及更高版本才支持的功能。 文章目录 PostGIS学习教程二十&#xff1a;3-D一、3-D几何图形二、3-D函数三、N-D索引 一、3-D几何图形 到目前为止&#xff0c;我们一直在处理2-D几何图形&#xff08;…

remote pdb使用记录

以前代码debug一直用原始的pdb&#xff0c;方便好用。最近接触的代码框架使用了ddp加速训练&#xff0c;导致pdb不好用了。 具体来说&#xff0c;在ddp训练时&#xff0c;用单卡训练&#xff0c;跟非ddp模式是一致的&#xff0c;python -m pdb xxx.py的模式也能正常用pdb。但是…

强化学习的数学原理学习笔记 - Actor-Critic

文章目录 概览&#xff1a;RL方法分类Actor-CriticBasic actor-critic / QAC&#x1f7e6;A2C (Advantage actor-critic)Off-policy AC&#x1f7e1;重要性采样&#xff08;Importance Sampling&#xff09;Off-policy PGOff-policy AC &#x1f7e6;DPG (Deterministic AC) 本…

C#,入门教程(13)——字符(char)及字符串(string)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(12)——数组及数组使用的基础知识https://blog.csdn.net/beijinghorn/article/details/123918227 字符串的使用与操作是必需掌握得滚瓜烂熟的编程技能之一&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; C#语言实…

python接口自动化测试框架介绍

之前在项目中搞了一套jmeter jenkins git ant接口自动化测试框架&#xff0c;在项目中运行了大半年了&#xff0c;效果还不错&#xff0c; 最近搞了一套requests unittest ddt pymysql BeautifulReport的接口自动化测试框架&#xff0c; 测试用例在yaml文件中&#xff0c…