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

简介: 本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。

由于,本人是主修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

// bind
    struct 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.0
    int rv = bind(fd, (const sockaddr *)&addr, sizeof(addr));
    if (rv) {
        die("bind()");
    }

    // listen
    rv = listen(fd, SOMAXCONN);
    if (rv) {
        die("listen()");
    }

这个sockaddr_in结构体:

linux上是这个:#include

windows上是这个:#include

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) {
        // accept
        struct 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 once
            int32_t err = one_request(connfd);
            if (err) {
                break;
            }
        }
        close(connfd);
    }
目录
相关文章
|
3月前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
3月前
|
NoSQL 网络协议 应用服务中间件
redis,memcached,nginx网络组件
redis,memcached,nginx网络组件
30 0
|
3月前
|
NoSQL Redis C++
Redis的实现五:二叉堆的数据结构和TTL、c,c++的实现
这篇文章详细探讨了二叉堆的数据结构及其在C和C++中的实现,特别强调了二叉堆在Redis中实现TTL(生存时间)功能的重要性,并通过代码示例展示了如何在Redis中使用二叉堆来管理键的过期时间。
51 0
|
3月前
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
47 0
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
75 17
|
1月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
59 10
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
66 10
|
1月前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。
|
1月前
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。