當前位置:
首頁 > 知識 > C語言C加加網路編程總結

C語言C加加網路編程總結

網路是用物理鏈路將各個孤立的工作站或主機相連在一起,組成數據鏈路,從而達到資源共享和通信的目的。通信是人與人之間通過某種媒體進行的信息交流與傳遞。網路通信是通過網路將各個孤立的設備進行連接,通過信息交換實現人與人,人與計算機,計算機與計算機之間的通信。

網路通信中最重要的就是網路通信協議。當今網路協議有很多,區域網中最常用的有三個網路協議:MICROSOFT的NETBEUI、NOVELL的IPX/SPX和TCP/IP協議。應根據需要來選擇合適的網路協議。

網路協議就是網路之間溝通、交流的橋樑,只有相同網路協議的計算機才能進行信息的溝通與交流。這就好比人與人之間交流所使用的各種語言一樣,只有使用相同語言才能正常、順網路通信利地進行交流。從專業角度定義,網路協議是計算機在網路中實現通信時必須遵守的約定,也就是通信協議。主要是對信息傳輸的速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等作出規定並制定出標準。

想要一起學習C++的可以加裙六二六八七一九一六,裙內有各種資料滿足大家,歡迎加裙

C/C++的後台程序都需要進行網路通訊,其實現方法無非有兩種:使用系統底層Socket或者使用已有的封裝好的網路庫(重量級的ACE,輕量級的有Libevent,Libev,libcurl,還有 Boost的ASIO)。

一.系統底層的Socket編程:

主要有以下6個步驟:

(1).socket()函數

(2).bind()函數

(3).listen()、connect()函數

(4).accept()函數

(5).read()、write()函數等

(6).close()函數

下面直接引用文章里的代碼說明:

server端:

#include#include#include#include#include#include#include#define MAXLINE 8192 int main(int argc, char** argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[8192]; int n; if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)
",strerror(errno),errno); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6666); if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)
",strerror(errno),errno); exit(0); } if( listen(listenfd, 10) == -1){ printf("listen socket error: %s(errno: %d)
",strerror(errno),errno); exit(0); } printf("======waiting for client"s request======
"); while(1){ if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } n = recv(connfd, buff, MAXLINE, 0); buff[n] = ""; printf("recv msg from client: %s
", buff); close(connfd); } close(listenfd); }

Client端:

#include#include#include#include#include#include#include#define MAXLINE 8192 int main(int argc, char** argv) { int sockfd, n; char recvline[8192], sendline[8192]; struct sockaddr_in servaddr; if( argc != 2){ printf("usage: ./client
"); exit(0); } if( (sockfd = socket(AF_INET, SOCK_STREAM, 0))

二. 常用開源socket庫:

1. ACE

ACE是一個大型的中間件產品,代碼20萬行左右,過於宏大,一堆的設計模式,架構了一層又一層,使用的時候,要根據情況,看你從那一層來進行使用。支持跨平台。

2. Boost的ASIO

Boost的ASIO是一個非同步IO庫,封裝了對Socket的常用操作,簡化了基於Socket程序的開發。它開源、免費、支持跨平台。

3. libevent

libevent是一個C語言寫的網路庫, 官方主要支持的是類linux操作系統, 最新的版本添加了對windows的IOCP的支持。由於IOCP是非同步IO,與linux下的POLL模型,EPOLL模型,還有freebsd的KQUEUE等這些同步模型在用法上完全不一致,所以使用方法也不一樣,就好比ACE中的Reactor和Proactor模式一樣,使用起來需要轉變思路。如果對性能沒有特別的要求,那麼使用libevent中的select模型來實現跨平台的操作, select模型可以橫跨windows, linux, unix,solaris等系統。

libev是一個C語言寫的,它是一個C語言寫的,只支持Linux系統的庫,以前的時候只封裝了EPOLL模型.使用方法類似libevent,但是非常簡潔,代碼量是最少的一個庫,也就幾千行代碼。顯然這樣的代碼跨平台肯定是無法支持的了,如果你只需要在Linux下面運行,那用這個庫也是可以的。

5. Linux Socket Programming In C++

6. C++ Sockets Library

它是一個跨平台的Sockets庫,實現包括TCP、UDP、ICMP、SCTP協議。已實現的應用協議包括有SMTP、HTTP(S)、Ajp。具有SOCKS客戶端實現以及匿名DNS,支持HTTP的GET/POST/PUT以及WebServer的框架。

7. Simple Socket

這個類庫讓編寫基於Socket的客戶/伺服器程序更加容易。

8. POCO

POCO C++ Libraries提供一套C++的類庫用以開發基於網路的可移植的應用程序,功能涉及線程、線程同步、文件系統訪問、流操作、共享庫和類載入、套接字以及網路協議包括:HTTP、FTP、SMTP等;其本身還包含一個HTTP伺服器,提供XML的解析和SQL資料庫的訪問介面。POCO庫的模塊化、高效的設計及實現使得POCO特別適合嵌入式開發。在嵌入式開發領域,由於C++既適合底層(設備I/O、中斷處理等)和高層面向對象開發,越來越流行。

9. Libcurl

免費的輕量級的客戶端網路庫,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS,LDAP, LDAPS,POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet, TFTP.支持SSL, HTTPPOST,HTTPPUT, FTP上傳, HTTP form上傳,代理,cookies,用戶名與密碼認證。

10. libiop

一個c語言開發的跨平台網路IO庫。功能特性:c/c++api,底層支持epoll,select,poll等io模型;非同步事件模型;任務池模型,跨平台線程介面;跨平台(Linux/windows);日誌服務;穩定,支持7*24小時無間斷運行,自動處理異常狀態;高並發與快速響應;API簡潔,學習成本低。

想要一起學習C++的可以加裙六二六八七一九一六,裙內有各種資料滿足大家,歡迎加裙


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 C加加 的精彩文章:

C加加編程中容易遇到的幾個問題
C加加中命名空間的 5 個常見用法
C加加語言的由來及特點附計機器語言的由來

TAG:C加加 |

您可能感興趣

C語言C加加編程快速入門系列
C語言/C加加編程學習—坦克大戰小遊戲製作代碼
C 的語言編程
C語言/C加加編程學習—代碼訓練之神奇星空動態繼承
從C語言實戰談C語言編程,談談C/C加加今後發展!
程序員,這門編程語言不輸 C/C+!
Go 語言編程
CMU神經網路自然語言處理課程
網路語言VS傳統文化 材料作文
C語言/C加加編程嵌入式基礎學習之volatile關鍵字
C語言編程基礎入門學習筆記
C語言編程新手基礎入門學習
高勝雨傳統筆墨語言提煉網路課程
眾網友界定編程語言,JS、SQL和HTML到底算編程語言嗎?
致程序員,這門編程語言不輸 C/C++!
C語言/C加加編程學習,怎樣判斷某一文件是否存在
編程語言排行中找不見它的編程語言VBA
C語言編程經典演算法
C語言編程入門:用C語言輸出九九乘法表
PLCCFC編程語言詳解,選擇器與合成器的應用