c++应用网络编程之一基本介绍

一、网络编程介绍

c++编程的应用场景在前面分析过,一个重要的方向就是网络编程。一般来说,开发者说的服务端编程在c++方向上简单的可以认为是网络编程。首先需要说明的,本系列不对网络编程的相关基础知识展开详细的说明,因为这种知识在书本上太多了。网络上各种资料更是满开飞,没有必要拷贝来拷贝去的。特别是一些协议等的解析说明,如果不遇到特定的问题不会深入分析说明。
那么最应该明白的网络编程是什么?那么就得明白网络是如何而来。网络,从名字上很好理解,一张把“经络”连接起来的大网。不过这个经络不是人体中的“经络”而是一个个节点,这个节点可以是虚拟的,也可以是物理的,也可以是混合的。它可以是一台电脑,一个手机,一个终端,也可以是一个局域网、城域网等等。
计算机的网络技术在计算机技术中算是比较早期的一种技术了,在60年代的中期就已经开始在实际应用了。但真正的普及是美国的国防用网络。早期学习电脑的或者看过早期电影的,都听说过某某黑客特别厉害,进入了五角大楼的网络,盗取了不少军事资料。可以这样讲,计算机的网络技术也是从美国开始兴起的,然后在全世界开始普及。这也解释了为什么现在最牛的互联网公司基本都在美国的一个重要原因。比如耳熟能详的谷歌、微软、脸书以及推特等等。
随着PC的出现和发展,局域网(LAN)出现。美国Xerox公司首先推出了Ethernet网,慢慢其成为了一种标准,大家都称现在的局域网络为以太网。有了局域就会有广域网WAN。不过需要说明的是,所谓局域与广域是一个相对概念,请大家一定要根据实际场景来确定。
网络技术其实就是处理PC间连接通信的技术。从物理上讲,如何识别网络中的PC,如何与其它PC交换数据等等。首先需要用物理导线将各个PC连接起来,一开始是电缆,后来光缆,再后来又有无线技术。然后还要有路由器和交换机把数据将有的传送到指定的PC。而为了实现上述的功能,就需要一系列的通信标准和通信协议。这就引出了网络协议的五层模型(七层就是个学术的东西,没啥实际应用的意义)。而这个模型中,则包含是最常见的网络编程中的TCP/IP、UDP、HTTP等最常见的网络编程技术。或者说的不准确一些,对大多数的网络编程人员来说,就是TCP/IP和UDP编程。在移动互联网中,HTTP则更为普及的被使用。至于其它的技术,基本都是相当专业的人员或者特定领域的开发者才会使用。

二、基本知识

这里不谈较老的技术和很新的技术,比如QUIC和HTTP3等。在网络编程中,可以分成两大类应用,即B/S开发和C/S开发(P2P以后专门讲),这里只谈C/S开发。即本系列主要针对C/S开发中的TCP/IP编程以及UDP的编程。只要掌握了它们的编程,其它的编程基本都差不多。在TCP/IP和UDP编程中,需要掌握一些基本的知识:
1、服务器
这个概念是一个非常容易混淆的概念,一定要区别在不同的语境和环境下的定义。在网络编程的语境下,一般是指承载网络服务软件的服务器电脑(硬件)。它可以分成网络内部自用,比如路由器、交换机等也可以只提供某种网络服务的电脑如打印服务器、邮箱服务器等。
2、服务端
服务端或服务端软件,也可以叫网络服务,在特定到C/S编程中,就是指提供连接服务的程序。一般来说,服务端是被接收连接的。
3、客户端
客户端在C/S编程中指发起连接的一端。
4、协议栈
协议栈(Protocol stack),又称协议堆叠,是计算机网络协议套件的一个具体的软件实现。
5、伯克利套接字
伯克利套接字(Berkeley sockets),也称为BSD Socket。其是一种使用C语言实现的网络编程抽象接口。现在几乎成为了互联网通信的标准接口。
6、五元组和三元组:
五元组包括:源IP地址,源端口,目的IP地址,目的端口和传输层协议。这等同于现实世界中的人和人之间的通信地址。
7、协议族
socket函数中的第一个参数中意义,也叫协议域。通常有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等。协议族确定socket的地址类型,即双方必须使用相同的通信类型才可以进行以通信。如常见的AF_INET需要用32位(类似192.168.0.1)ipv4地址与16位端口号(最大65535)的组合、AF_UNIX需要用一个绝对路径名作为地址。

当然,还有很多的基础性的知识和名词术语。网络技术是一个发展了很多年的技术,它既成熟又年轻。举一个简单的例子,当有一个人说他是搞服务端编程的,如何确定他的技术栈?其实这个定义非常难确定,网上一些大牛的说明其实也不能够完全覆盖相关的内容,即他们的定义也是不严谨的。但仅从经验和学识来推断,特定到C/c++中,它一般是指TCP/IP编程的相关技术栈(当然,它也不严谨)。
再举一个实际的例子,大家去品一下上面这段话,至于能理解多少看自身了。在某电力部门,要求把服务端程序部署在终端上,把客户端程序部署在服务器上。客户端要24*7运行,服务端可以允许断线。
注意:再次说明,本系列不是对网络编程技术基础知识的详细分析说明,是对c++在网络编程上的应用分析说明,所以只对相关的一些知识点进行指出和简要的说明。更多的相关知识,请自行查阅下面提供的书籍和资料!

三、简单示例

虽然网络编程的例子多之又多,但这里还是要给一个简单的例子:
服务端:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    const char* msg = "hello moto!";

    //创建socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    //设置选项
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }

    //地址设置
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons( 8888 );

    //绑定端口
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
        perror("bind err");
        exit(EXIT_FAILURE);
    }

    //监听
    if (listen(server_fd, 5) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    //接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
        perror("accept err!");
        exit(EXIT_FAILURE);
    }

    send(new_socket , msg , strlen(msg) , 0 );
    printf("send msg ...\n");
    memset(buffer, '\0' , 1024);
    int ret = recv( new_socket , buffer, 1024,0);
    printf("%s\n",buffer );
    return 0;
}

客户端:

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

int main() {
    int sock = 0, ret;
    struct sockaddr_in serv_addr;
    const char* msg = "hello !";
    char buffer[1024] = {0};

    //创建socket
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket  error \n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8888);

    //转换地址
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
        printf("\n Invalid address  \n");
        return -1;
    }

    //连接server
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\n Connection err \n");
        return -1;
    }

    send(sock , msg , strlen(msg) , 0 );
    printf("send msg !\n");
    ret = recv( sock , buffer, 1024,0);
    printf("%s\n",buffer );
    return 0;
}

写这种测试的小例程有一个需要注意的地方,客户端发送完成后,不要立即退出,否则可能服务端收不到相关的消息。

四、推荐的资料和书籍

一如在VC编程上侯捷教师是一个令开发者仰望的山峰,在网络编程也有很多更高的高峰。比如常见的推荐的《TCP/IP详解》三卷和《Unix网络编程》两卷的作者W. Richard Stevens(当然他写的APUE也相当的出名)。不过这些书的缺点也有,就是太老了。导致一些技术已经落后而一些新技术没有体现出来。其它国外的还有不少就不一一列举。国内也有几个比较有名气的网络开发者,限定到本文这个场景非常推荐MUDUO库的作者陈硕。当然就像江湖中一样,肯定还有很多高手隐身不出。
学习网络编程的书籍非常多,比如CSDN的孟岩大佬的“四书五经”之说就是为多数大牛推荐的。这里简单罗列一下:
1、TCP/IP详解(三卷)(TCP/IP Illustrated)
2、Unix网络编程(两卷)(UNIX Network Programming)
3、TCP/IP高级编程(Effective TCP/IP Programming)
4、C++网络编程(两卷)(C++ Network Programming)
虽然这些书籍非常不错,但对于初学者未必就合适,也推荐一些比较容易借鉴学习的书籍:
1、《Linux多线程服务端编程》 陈硕
2、《Linux高性能服务端编程》 游双
3、《Windows网络与通信程序设计》 王艳平
并不是说其它的书籍不值得推荐,是觉得这几本书更容易被学习和接受。至于网络上的资料就更多了,如陈硕、原网易的云风等人的BLOG都非常值得一看。个人的建议是,要根据自己的实际情况来决定学习成长的路线,不要人云亦云。大牛们给的建议可能对大多数人都是非常好的,但具体到某些个体,可能会有所不妥。大家要知道如何不断的根据大牛们的建议因地制宜的学习。
另外在网上还存在着大量的网络框架如C++网络编程中的ACE,还有libevent,libuv,libev,libeio,libhv,asio,poco等等。毕竟网络应用是一个非常高频的应用,也是很多开发者想登顶的希望。
其实还有很多应用程序中也有非常好的例子,比如REDIS,有时间推荐看看内部如何跨平台实现了网络服务端的编程。

五、总结

网络编程是一个复杂的应用,一般来说,很难在一两年内达到熟练掌握的程度,更不要谈精通了。通常,把基础的网络知识学习完成,头脑中有一个相对完整的网络编程概念,然后在实际应用中不断的加以印证,才能更快更好的掌握网络编程。
网络编程其实是一个简单应用易,复杂应用极难的技术。它不仅是涉及到网络相关的技术,还包括内存管理、多线(进)程以及异步编程等很多技术,甚至是否需要跨平台跨系统等。对大多数开发者言,网络编程的应用一般都是比较简单的应用,并发通常也就是十个量级左右,而且经常类似于交互式通信那种情况。对多线程和异步的要求不高甚至没有,对内存管理和效率的要求也不严格。
但当真正到了C10K以上的编程时,复杂程度立刻便上来,导致很多开发者没有一个过渡便直面这些复杂的应用。也就是说,在网络编程大多数的编程场景是要么简单,要么复杂,中等的开发场景非常少。而且从设计上考虑,一旦到了中等的场景,优秀的架构师通常会考虑扩展的情况下设计成更为复杂的框架结构。
复杂的网络编程,导致很多的框架的出现,而这些框架的出现更是切断了大多数开发者对背后复杂结构的理解,导致一个从初级网络编程到高级网络编程的连续而完整的流程,即要么只会简单的编程,要么只会在框架下完成各种场景的应用。
更何况,网络编程的实际要求仍然在不断的增长,这也是前面分析DPDK和XDP等的一些重要原因。换句话说,网络编程的技术仍然在不断的进步。所以,不断的学习才能保证在网络编程的方向上有更大的发展。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全网最详细的 gin框架请求数据绑定Bind 源码解析 -- 帮助你全面了解gin框架的请求数据绑定原理和方法

在gin框架中&#xff0c;我们可以将多种请求数据&#xff08;json, form,uri&#xff0c;header等&#xff09;直接绑定到我们定义的结构体&#xff0c;底层是通过反射方式获取我们定义在结构体上面的tag来实现请求数据到我们的结构体数据的绑定的。 在gin的底层有2大体系的数据…

华为HCIP Datacom H12-821 卷19

1.多选题 如图所示,RTA 的 GE0/0/0、GE0/0/1 接口分别连接部门 1 和 2,其网段分别为 10.1.2.0/24、 10.1.3.0/24 网段,为限制部门 1 和 2 之间的相互访问,在 RTA 上部署 traffic-filter,以下哪些部署方式是正 确? A、配置 ACL3000 拒绝源为 10.1.2.0/24 目的为 10.1.3.0…

matlab仿真 通信信号和系统分析(上)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第三章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 一、求离散信号卷积和 主要还是使用卷积函数conv&#xff0c;值得注意的是&#xff0c;得到的卷积和长度结果为81&#xff0…

【正点原子K210连载】第十四章 按键输入实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十四章 按键输入实…

短信验证码API的防护策略?怎么优化更新?

短信验证码API的定制化服务怎么样&#xff1f;如何选择API服务&#xff1f; 短信验证码API成为保护用户账户和数据的重要工具&#xff0c;对短信验证码API的防护也显得尤为重要。AoKSend将探讨短信验证码API的防护策略&#xff0c;帮助企业和开发者确保系统的安全性和可靠性。…

FatFs(文件系统)

1官网 FatFs - 通用 FAT 文件系统模块 (elm-chan.org) FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 模块是按照 ANSI C &#xff08;C89&#xff09; 编写的&#xff0c;并且与磁盘 I/O 层完全分离。因此&#xff0c;它独立于平台。它可以集成到资源有限…

2024 vue3入门教程:01vscode终端命令创建第一个vue项目

参考vue官网手册&#xff1a;https://cn.vuejs.org/guide/quick-start.html 一、找个盘符&#xff0c;新建文件夹存储以后得vue项目 我的是e盘下创建了vueproject 二、使用vscode打开存储vue项目的文件夹 因为我生成过项目&#xff0c;所以有文件&#xff0c;你们初次是没有…

【第五节】C/C++数据结构之图

目录 一、图的基本概念 1.1 图的定义 1.2 图的其他术语概念 二、图的存储结构 2.1 邻接矩阵 2.2 邻接表 三、图的遍历 3.1 广度优先遍历 3.2 深度优先遍历 四、最小生成树 4.1 最小生成树获取策略 4.2 Kruskal算法 4.3 Prim算法 五、最短路径问题 5.1 Dijkstra算…

WPF----自定义滚动条ScrollViewer

滚动条是项目当中经常用到的一个控件&#xff0c;大部分对外项目都有外观的需求&#xff0c;因此需要自定义&#xff0c;文中主要是针对一段动态的状态数据进行展示&#xff0c;并保证数据始终在最新一条&#xff0c;就是需要滚动条滚动到底部。 1&#xff0c;xaml中引入 <…

【大模型系列】Language-Vision Transformer(LaVIT, ICLR2024)

Title&#xff1a;Unified Language-Vision Pretraining in LLM with Dynamic Discrete Visual TokenizationPaper&#xff1a;https://arxiv.org/abs/2309.04669Github&#xff1a;https://github.com/jy0205/LaVITAuthor&#xff1a;Yang Jin&#xff0c; 北大&#xff0c;快…

Android Native 客户端属性配置系统使用说明

Android Native 客户端属性配置系统使用说明 背景和问题现代 android 开发基本都基于 gradle 属性设置来进行定制化编译,随着项目的迭代,工程结构越发复杂,配置属性越来越多,越来越多的配置使得上手难度越来越大。 解决方案设计一般而言,在 android 开发中,Gradle 属性系…

141个图表,完美展示数据分类别关系!

本文介绍使用Python工具seaborn详细实现分类关系图表&#xff0c;包含8类图141个代码模版。 分类关系图表用于展示数字变量和一个或多个分类变量之间的关系&#xff0c;可以进一步分为&#xff1a;箱形图&#xff08;box plot&#xff09;、增强箱形图&#xff08;enhanced bo…

阿里云物联网应用层开发:第二部分,云产品流转

文章目录 1、云产品流转概述2、我们需要创建多少个云产品流转&#xff1f;3、阿里云物联网平台产品云流转实现3-1 创建数据源3-2 创建数据目的3-2 创建解析器,并关联数据、编写脚本 1、云产品流转概述 云产品流转可以看成是一个转发的功能&#xff0c;阿里云官方的解释是&…

【操作与配置】Xshell安装使用

Xshell是一款功能强大的远程管理工具&#xff0c;主要用于通过SSH&#xff08;Secure Shell&#xff09;、TELNET等协议连接和管理远程服务器。它支持多种会话管理、脚本编写、端口转发等功能&#xff0c;适合系统管理员和开发者使用。 安装 官网下载&#xff1a;家庭/学校免费…

linux企业级CDN/100万并发架构设计/企业故障案例、网站优化架构原则

高薪思想&#xff1a;财富来源于信息差 什么是cdn&#xff1f; cdn全称是contenct delivery network内容分发网络 cdn是一套分布式&#xff0c;缓存&#xff0c;集群&#xff0c;范围可以是全球或全国&#xff0c;运行的实质是通过智能DNS获取用户的来源地域以及上网线路 为…

13_网络安全

目录 网络安全协议 网络安全协议 PGP协议 网络安全技术 防火墙技术 入侵检测系统 入侵防御系统 杀毒软件 蜜罐系统 计算机病毒与木马 网络安全协议 网络安全协议 物理层主要使用物理手段隔离、屏蔽物理设备等&#xff0c;其他层都是靠协议来保证传输的安全&#xff…

【C++】内存分区

目录 内存分区代码运行前后区别各分区详细解释C内存申请和释放 内存分区 不同的操作系统对程序内存的管理和划分会有所不同。 此处是C内存区域划分主要是针对通用的情况&#xff0c;并不限定在某个特定操作系统上 一般分为4个区&#xff08;有时把全局区拆分成数据区未初始化…

Go线程调度器

基本结构 字段gcwaiting、stopwait和stopnoted都是串行运行时任务执行前后的辅助协调手段 gcwaiting字段的值用于表示是否需要停止调度 在停止调度前&#xff0c;该值会被设置为1在恢复调度之前&#xff0c;该值会被设置为0这样做的作用是&#xff0c;一些调度任务在执行时只…

阿里云智能编程助手的安装使用

https://help.aliyun.com/document_detail/2590613.html 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力&a…

企业互联网建站源码系统 附带完整的安装代码包以及搭建部署教程

系统概述 企业互联网建站源码吸系统是一款集众多先进功能于一身的建站工具。它提供了丰富的模板和组件&#xff0c;允许企业根据自身需求和品牌形象进行个性化定制&#xff0c;快速搭建出具有独特风格的网站。 代码示例 系统特色功能一览 1.用户友好界面&#xff1a;系统采用…