C\C++网络编程总结

37 篇文章 1 订阅

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

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

网络通信中最重要的就是网络通信协议。当今网络协议有很多,局域网中最常用的有三个网络协议: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简洁,学习成本低。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。 目 录 第1部分C++ 多线程系统编程 第1章线程安全的对象生命期管理3 1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . . . . . . . . . . . . . . . 4 1.1.3一个线程安全的Counter 示例.. . . . . . . . . . . . . . . . . . . 4 1.2对象的创建很简单. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 5 1.3销毁太难. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 7 1.3.1mutex 不是办法. . . . . . . . . . . . . . . . . . . .. . . . . . . . 7 1.3.2作为数据成员的mutex 不能保护析构.. . . . . . . . . . . . . . 8 1.4线程安全的Observer 有多难.. . . . . . . . . . . . . . . . . . . . . . . . 8 1.5原始指针有何不妥. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 11 1.6神器shared_ptr/weak_ptr . . . . . . . . . .. . . . . . . . . . . . . . . . 13 1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . . . . . . . . . . . . . . . . . . . . 17 1.10shared_ptr 技术与陷阱. . . .. . . . . . . . . . . . . . . . . . . . . . . . 19 1.11对象池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 21 1.11.1enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23 1.11.2弱回调. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 24 1.12替代方案. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 26 1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器(mutex). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.1.1只使用非递归的mutex . . . . . . . . . . . . . .. . . . . . . . . . 33 2.1.2死锁. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 35 2.2条件变量(condition variable). . . . . . . . . .
Linux网络编程是指在Linux操作系统下使用C语言进行网络编程的过程。在Linux网络编程中,可以使用一些函数来进行字节序转换和处理Socket地址。 关于字节序转换,可以使用以下函数: - 主机字节序转网络字节序:htons、htonl函数(host to net 无符号short/int) - 网络字节序转主机字节序:ntohs、ntohl(net to host 无符号short/int) 关于Socket地址的处理,可以使用以下结构体和函数: - sockaddr_storage结构体:表示一个通用的Socket地址结构体,用于封装端口号和IP等信息。 - sockaddr_in和sockaddr_in6结构体:专用于TCP/IP协议族的Socket地址结构体。 - 在网络编程中,可以根据地址族来确定使用哪种结构体,并使用相应的函数进行处理。 在Linux网络编程中,可以使用一些开源项目如Redis、Muduo、TeamTalk等作为学习的参考,其中Muduo是一个比较经典的网络编程框架。 需要注意的是,网络编程函数的诞生早于IPv4协议时期,因此使用的是struct sockaddr结构体。为了向前兼容,现在sockaddr被退化为(void *)的作用,而具体使用的是sockaddr_in还是sockaddr_in6则取决于地址族,函数内部会根据需要进行强制类型转换。 总结起来,Linux网络编程是在Linux操作系统下使用C语言进行网络编程的过程,其中涉及到字节序转换和处理Socket地址的相关函数和结构体。可以通过学习开源项目和相关资料进一步深入了解和应用网络编程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值