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!";//创建socketif ((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};//创建socketif ((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;}//连接serverif (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.mzph.cn/web/37541.shtml

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

相关文章

玛格家居从深交所转板北交所:营收净利润连年下滑,销售费用大增

《港湾商业观察》施子夫 近日&#xff0c;玛格家居股份有限公司&#xff08;以下简称&#xff0c;玛格家居&#xff09;发布公告&#xff0c;重庆证监局已经受理其北交所上市的备案申请&#xff0c;辅导机构为国泰君安证券。 公开信息显示&#xff0c;2022年1月&#xff0c;玛…

【转】Android静态集成X5内核

项目中的老机器使用webview 无法加载vue3打包的网页&#xff0c;只能用独立的webview内核&#xff0c;采用静态加载x5内核的方式&#xff0c; 以下内容转自简书作者漆先生的博客&#xff0c;仅用作备份记录 之前在项目中在线集成的X5内核&#xff0c;但是效果不好&#xff0c;只…

基于STM32的智能电池管理系统

目录 引言环境准备智能电池管理系统基础代码实现&#xff1a;实现智能电池管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;电池管理与优化问题解决方案与优化收尾与总结 1. 引言 智能电池管理系统&#xff08;Ba…

【昇思25天学习打卡营打卡指南-第十三天】ShuffleNet图像分类

ShuffleNet图像分类 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操…

GPT-5 一年半后发布,打开人工智能新世纪

关于GPT-5一年半后发布的消息&#xff0c;这一预测主要基于OpenAI首席技术官Mira Murati的采访和声明。然而&#xff0c;需要明确的是&#xff0c;这个时间点&#xff08;即2025年底或2026年初&#xff09;已经与早期传闻有所不同&#xff0c;显示了OpenAI对产品质量的重视&…

react18.x+播放文本内容

需要调接口将文字传递给后端将文字转换成音频文件&#xff0c;然后播放&#xff0c;同时每次播放不同文本时&#xff0c;当前播放的文本需要暂停&#xff0c;切换到播放新点击的文本 可以设置缓存播放过的音频&#xff0c;也可以不设置缓存&#xff1a; 设置缓存的代码如下&am…

骁龙相机拍照流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 1.deliverInputEvent 拍照点击事件处理 2.submitRequestList Camera 提交拍照请求 3.createCaptureRequest 拍照请求帧数 骁龙相机通过binder 数据传输…

idea 内存参数修改不生效问题解决 VM参数设置不生效解决

很多人配置idea 内存参数&#xff0c;怎么配置都不生效&#xff0c;主要原因是配置文件用的不是你修改的那个。 系统环境变量中的这个才是你真正要修改的配置文件。 找到并修改后保存&#xff0c;重启idea就可生效

C++ | Leetcode C++题解之第208题实现Trie(前缀树)

题目&#xff1a; 题解&#xff1a; class Trie { private:vector<Trie*> children;bool isEnd;Trie* searchPrefix(string prefix) {Trie* node this;for (char ch : prefix) {ch - a;if (node->children[ch] nullptr) {return nullptr;}node node->children[…

人工与智能系统之间的交互方式

人工与智能系统之间的交互方式 #mermaid-svg-xSsFZWak2bsyV0un {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xSsFZWak2bsyV0un .error-icon{fill:#552222;}#mermaid-svg-xSsFZWak2bsyV0un .error-text{fill:#5522…

分词算法在自然语言处理中的基本原理与应用场景

分词算法在自然语言处理中的基本原理与应用场景 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 分词是自然语言处理&#xff08;NLP&#xff09;中的重要基础…

python脚本 限制 外部访问 linux服务器端口

注意&#xff1a;该脚本会清空linux防火墙的filter表的规则和用户自定义链路 脚本的效果是将端口限制为仅服务器内部访问&#xff0c;提高服务的安全性&#xff0c;稳定性 可以提供ip地址白名单 具体脚本&#xff1a; #!/usr/bin/python3 import argparse, subprocess, sys,…

13_网络安全

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

美国服务器租用详细介绍与租用流程

在数字化时代&#xff0c;服务器租用已成为许多企业和个人拓展业务、存储数据的重要选择。美国作为全球科技发展的前沿阵地&#xff0c;其服务器租用服务也备受瞩目。下面&#xff0c;我们将详细介绍美国服务器租用的相关知识及租用流程。 一、美国服务器租用简介 美国服务器租…

中英双语介绍美国的州:新泽西州(New Jersey)

中文版 新泽西州&#xff08;New Jersey&#xff09;位于美国东北部&#xff0c;是美国面积较小但人口密度较高的州之一。新泽西州因其便利的地理位置、发达的经济和丰富的历史文化而闻名。以下是对新泽西州各方面的详细介绍&#xff1a; 人口 截至2020年&#xff0c;美国人…

引领汽车软件开发走向ASPICE认证之路

亚远景科技与ASPICE认证的关系可以从以下几个方面来阐述&#xff1a; (要明确的是&#xff1a;在ASPICE行业中专业来说&#xff0c;ASPICE项目是没有认证&#xff0c;而只有评估。不过&#xff0c;为了方便沟通&#xff0c;人们常将这一评估过程称为认证。&#xff09; 行业专…

tomcat定时重启

Tomcat定时重启&#xff08;linux&#xff09; 1. 编写脚本 在tomcat的bin目录下&#xff0c;使用vim restart.sh&#xff0c;编写restart.sh脚本&#xff0c;插入一下内容&#xff0c;最后并保存&#xff01; #!/bin/bash# 初始化全局环境变量 . /etc/profilecd /usr/loca…

探索数据结构:队列的的实现与应用

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、队列的概念 队列是一个线性的数据结构&#…

windows环境下创建python虚拟环境

windows环境下创建python虚拟环境 使用virtualenv库创建虚拟环境&#xff0c;可使不同的项目处于不同的环境中 安装方法&#xff1a; pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple pip install virtualenvwrapper-win -i https://pypi.tuna.tsinghua…

Spring Cloud Alibaba之负载均衡组件Ribbon

一、什么是负载均衡&#xff1f; &#xff08;1&#xff09;概念&#xff1a; 在基于微服务架构开发的系统里&#xff0c;为了能够提升系统应对高并发的能力&#xff0c;开发人员通常会把具有相同业务功能的模块同时部署到多台的服务器中&#xff0c;并把访问业务功能的请求均…