C\C++网络编程总结

转载 2016年08月30日 10:10:05

网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。通信是人与人之间通过某种媒体进行的信息交流与传递。网络通信是通过网络将各个孤立的设备进行连接,通过信息交换实现人与人,人与计算机,计算机与计算机之间的通信。

网络通信中最重要的就是网络通信协议。当今网络协议有很多,局域网中最常用的有三个网络协议:MICROSOFT的NETBEUI、NOVELL的IPX/SPX和TCP/IP协议。应根据需要来选择合适的网络协议。

网络协议就是网络之间沟通、交流的桥梁,只有相同网络协议的计算机才能进行信息的沟通与交流。这就好比人与人之间交流所使用的各种语言一样,只有使用相同语言才能正常、顺网络通信利地进行交流。从专业角度定义,网络协议是计算机在网络中实现通信时必须遵守的约定,也就是通信协议。主要是对信息传输的速率、传输代码、代码结构、传输控制步骤、出错控制等作出规定并制定出标准。

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)\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(“listen 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是一个大型的中间件产品,代码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++网络编程总结与ZeroMQ

现在几乎所有C/C++的后台程序都需要进行网络通讯,其实现方法无非有两种:使用系统底层socket或者使用已有的封装好的网络库。本文对两种方式进行总结,并介绍一个轻量级的网络通讯库ZeroMQ。 ...

C/C++网络编程总结

网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。通信是人与人之间通过某种媒体进行的信息交流与传递。网络通信是通过网络将各个孤立的设备进行连接,通过信息交...

C/C++网络编程总结与ZeroMQ

现在几乎所有C/C++的后台程序都需要进行网络通讯,其实现方法无非有两种:使用系统底层socket或者使用已有的封装好的网络库。本文对两种方式进行总结,并介绍一个轻量级的网络通讯库ZeroMQ。 ...
  • zhu2695
  • zhu2695
  • 2016年05月02日 14:57
  • 870

Qt c/C++ 混合编程,windows下的网络编程--udp封装(一)

首先说一下.Pro文件myudp.proTEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG -= qt LIBS += -lWs2...

C/C++ 网络编程3: 套接字基础

部分信息参考 信息安全实验 信息安全实验四实验参考 参考 信息安全实验资料 四个PPT文件 server.c 套接字地址 Linux系统的套接字可以支持多种协议,每种不同的协...

【网络编程】httpClient抓取网页--linux C/C++

最近项目需要用到网页抓取下载等,简单说就是编写一个可用的httpClient,故总结如下。 开发环境linux,开发语言C/C++。 在网上检索一番后,大致了解了,有如下2种方法: 1. 直接...

基于Linux下C/C++的网络编程之进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线...

linux下C/C++网络编程基本:socket实现tcp和udp的例子

简单的linux下socket编程,分别基于TCP和UDP协议实现的简单程序 linux下socket编程可以概括为以下几个函数的运用: socket() bind() listen()...

C/C++实现基于UDP的网络编程

在网络编程中,我们一般用UDP或者TCP这两种协议来进行编写网络应用程序,那叫UDP呢? UDP:UDP的简称是User Datagram Protocol,中文名是用户数据报协议,是OSI 参考模...

linux c/c++网络编程之—线程池模型

网络编程是一个程序员必须掌握的一项技能,尤其c/c++程序员必须掌握,而实际应用中,绝大部分网络程序都不可能是单连接,那么就意味着需要处理并发问题,目前来说主流的linux下的网络模型基本都基于epo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C\C++网络编程总结
举报原因:
原因补充:

(最多只允许输入30个字)