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);
    }
目录
相关文章
|
5月前
|
监控 Linux 测试技术
C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
🌟 蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕C++与零拷贝网络编程,从sendfile到DPDK,实战优化服务器性能,毫秒级响应、CPU降60%。分享架构思维,共探代码星辰大海!
|
12月前
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
Ubuntu 网络协议 Unix
02理解网络IO:实现服务与客户端通信
网络IO指客户端与服务端通过网络进行数据收发的过程,常见于微信、QQ等应用。本文详解如何用C语言实现一个支持多客户端连接的TCP服务端,涉及socket编程、线程处理及通信流程,并分析“一消息一线程”模式的优缺点。
438 0
|
canal 编解码 运维
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
435 12
|
人工智能 自然语言处理 决策智能
智能体竟能自行组建通信网络,还能自创协议提升通信效率
《一种适用于大型语言模型网络的可扩展通信协议》提出创新协议Agora,解决多智能体系统中的“通信三难困境”,即异构性、通用性和成本问题。Agora通过标准协议、结构化数据和自然语言三种通信格式,实现高效协作,支持复杂任务自动化。演示场景显示其在预订服务和天气预报等应用中的优越性能。论文地址:https://arxiv.org/pdf/2410.11905。
470 6
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
445 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
缓存 网络协议 安全
即时通讯初学者必知必会的20个网络编程和通信安全知识点
即时通讯IM应用开发的初学者很容易迷失在网络编程的复杂性以及通信安全的各种概念里,本文不涉及深度理论知识,尽量通过一句话或几句话让你快速了解20个相关的网络编程和通信安全知识点,希望能助你愉快地开始即时通讯应用开发。
497 0
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
477 11
|
网络协议
计算机网络与通信
计算机网络基本概念:了解计算机网络的定义、功能、分类和拓扑结构(如总线型、星型、环型、树形、网状等)。 网络通信原理:了解网络通信的基本原理、协议和技术,如TCP/IP协议、网络通信设备等。
273 3