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.pswp.cn/web/37541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37541.shtml
英文地址,請注明出處:http://en.pswp.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;并把訪問業務功能的請求均…