日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

C\C++网络编程总结

發(fā)布時間:2025/7/25 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C\C++网络编程总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

from:?http://www.58maisui.com/2016/08/30/221/?ref=myread

網(wǎng)絡(luò)是用物理鏈路將各個孤立的工作站或主機(jī)相連在一起,組成數(shù)據(jù)鏈路,從而達(dá)到資源共享和通信的目的。通信是人與人之間通過某種媒體進(jìn)行的信息交流與傳遞。網(wǎng)絡(luò)通信是通過網(wǎng)絡(luò)將各個孤立的設(shè)備進(jìn)行連接,通過信息交換實(shí)現(xiàn)人與人,人與計(jì)算機(jī),計(jì)算機(jī)與計(jì)算機(jī)之間的通信。

網(wǎng)絡(luò)通信中最重要的就是網(wǎng)絡(luò)通信協(xié)議。當(dāng)今網(wǎng)絡(luò)協(xié)議有很多,局域網(wǎng)中最常用的有三個網(wǎng)絡(luò)協(xié)議:MICROSOFT的NETBEUI、NOVELL的IPX/SPX和TCP/IP協(xié)議。應(yīng)根據(jù)需要來選擇合適的網(wǎng)絡(luò)協(xié)議。

網(wǎng)絡(luò)協(xié)議就是網(wǎng)絡(luò)之間溝通、交流的橋梁,只有相同網(wǎng)絡(luò)協(xié)議的計(jì)算機(jī)才能進(jìn)行信息的溝通與交流。這就好比人與人之間交流所使用的各種語言一樣,只有使用相同語言才能正常、順網(wǎng)絡(luò)通信利地進(jìn)行交流。從專業(yè)角度定義,網(wǎng)絡(luò)協(xié)議是計(jì)算機(jī)在網(wǎng)絡(luò)中實(shí)現(xiàn)通信時必須遵守的約定,也就是通信協(xié)議。主要是對信息傳輸?shù)乃俾省鬏敶a、代碼結(jié)構(gòu)、傳輸控制步驟、出錯控制等作出規(guī)定并制定出標(biāo)準(zhǔn)。

C/C++的后臺程序都需要進(jìn)行網(wǎng)絡(luò)通訊,其實(shí)現(xiàn)方法無非有兩種:使用系統(tǒng)底層Socket或者使用已有的封裝好的網(wǎng)絡(luò)庫(重量級的ACE,輕量級的有Libevent,Libev,libcurl,還有 Boost的ASIO)。

一.系統(tǒng)底層的Socket編程:

主要有以下6個步驟:

(1).socket()函數(shù)

(2).bind()函數(shù)

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

(4).accept()函數(shù)

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

(6).close()函數(shù)

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

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)\n”,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)\n”,strerror(errno),errno);

exit(0);

}

if( listen(listenfd, 10) == -1){

printf(“l(fā)isten socket error: %s(errno: %d)\n”,strerror(errno),errno);

exit(0);

}

printf(“======waiting for client’s request======\n”);

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] = ‘\0’;

printf(“recv msg from client: %s\n”, 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\n”);

exit(0);

}

if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){

printf(“create socket error: %s(errno: %d)\n”, strerror(errno),errno);

exit(0);

}

memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(6666);

if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){

printf(“inet_pton error for %s\n”,argv[1]);

exit(0);

}

if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){

printf(“connect error: %s(errno: %d)\n”,strerror(errno),errno);

exit(0);

}

printf(“send msg to server: \n”);

fgets(sendline, 8192, stdin);

if( send(sockfd, sendline, strlen(sendline), 0) < 0)

{

printf(“send msg error: %s(errno: %d)\n”, strerror(errno), errno);

exit(0);

}

close(sockfd);

exit(0);

}

二. 常用開源socket庫:

1. ACE

ACE是一個大型的中間件產(chǎn)品,代碼20萬行左右,過于宏大,一堆的設(shè)計(jì)模式,架構(gòu)了一層又一層,使用的時候,要根據(jù)情況,看你從那一層來進(jìn)行使用。支持跨平臺。

2. Boost的ASIO

Boost的ASIO是一個異步IO庫,封裝了對Socket的常用操作,簡化了基于Socket程序的開發(fā)。它開源、免費(fèi)、支持跨平臺。

3. libevent

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

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

5. Linux Socket Programming In C++

6. C++ Sockets Library

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

7. Simple Socket

這個類庫讓編寫基于Socket的客戶/服務(wù)器程序更加容易。

8. POCO

POCO C++ Libraries提供一套C++的類庫用以開發(fā)基于網(wǎng)絡(luò)的可移植的應(yīng)用程序,功能涉及線程、線程同步、文件系統(tǒng)訪問、流操作、共享庫和類加載、套接字以及網(wǎng)絡(luò)協(xié)議包括:HTTP、FTP、SMTP等;其本身還包含一個HTTP服務(wù)器,提供XML的解析和SQL數(shù)據(jù)庫的訪問接口。POCO庫的模塊化、高效的設(shè)計(jì)及實(shí)現(xiàn)使得POCO特別適合嵌入式開發(fā)。在嵌入式開發(fā)領(lǐng)域,由于C++既適合底層(設(shè)備I/O、中斷處理等)和高層面向?qū)ο箝_發(fā),越來越流行。

9. Libcurl

免費(fèi)的輕量級的客戶端網(wǎng)絡(luò)庫,支持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,用戶名與密碼認(rèn)證。

10. libiop

一個c語言開發(fā)的跨平臺網(wǎng)絡(luò)IO庫。功能特性:c/c++api,底層支持epoll,select,poll等io模型;異步事件模型;任務(wù)池模型,跨平臺線程接口;跨平臺(Linux/windows);日志服務(wù);穩(wěn)定,支持7*24小時無間斷運(yùn)行,自動處理異常狀態(tài);高并發(fā)與快速響應(yīng);API簡潔,學(xué)習(xí)成本低。


總結(jié)

以上是生活随笔為你收集整理的C\C++网络编程总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。