谈一谈网络编程学习经验

  • 时间:
  • 浏览:3
  • 来源:彩神幸运飞艇_神彩幸运飞艇官方

9

5

8

6

建议没没办法 人 去看原文:http://cloud.github.com/downloads/chenshuo/documents/LearningNetworkProgramming.pdf

1

谈一谈网络编程学习经验

陈硕

giantchen@gmail.com

blog.csdn.net/Solstice

weibo.com/giantchen

2012-02-13

本文谈一谈我在学习网络编程方面的并且 买车人经验。“网络编程”并且 术语的范围很广,本文指用

Sockets API 开发基于 TCP/IP 的网络应用系统进程池池,具体定义见“网络编程的各种任务角色”一节。

受限于买车人的经历和经验,这篇文章的适应范围是:

 x86-64 Linux 服务端网络编程,直接或间接使用 Sockets API

 公司内网。不一定是局域网,但总体趋于稳定公司防火墙之内,环境可控

本文并且不适合:

 PC 客户端网络编程,系统进程池池运行在客户的 PC 上,环境多变且不可控

 Windows 网络编程

 面向公网的服务系统进程池池

 高性能网络服务器

本文分一另另有有三个 次责:

1. 网络编程的并且 胡思乱想,谈谈我对并且 领域的认识

2. 几本必看的书,基本上还是 W. Richard Stevents 那几本

另外,本文没办法 很糙说明时均暗指 TCP 协议,“连接”是“TCP 连接”,“服务端”是“TCP 服务端”。

网络编程的并且 胡思乱想

以下胡乱列出我对网络编程的并且 想法,前后无关联。

网络编程是那此?

网络编程是那此?是熟练使用 Sockets API 吗?说实话,在实际项目里我只用过两次 Sockets API,其

他以前时会 使用封装好的网络库。

第一次是 805 年在学校做一另另有有三个 羽毛球赛场计分系统:我用 C# 编写运行在 PC 机上的软件,负责比

分的显示;再用 C# 写了运行在 PDA 上的计分界面,记分员拿着 PDA 记录比分;这两次责系统进程池池通过 TCP

协议相互通信。这确实是个简单的分布式系统,体育馆有不止一片场地,每个场地时会 一名拿 PDA 的

记分员,每个场地时会 两台显示比分的 PC 机(显示器是 42 吋平板电视,放上场地的对角,原本两边看

台的观众都能看得人比分)。这两台 PC 机功能不完正一样,一台只负责显示当前比分,另一台必须负责

与 PDA 通信,并更新数据库里的比分信息。此外,还有一台 PC 机负责周期性地从数据库读出完正 7 片

场地的比分,显示在体育馆墙上的大屏幕上。这台 PC 上还运行着一另另有有三个 系统进程池池,负责生成比分数据的静态

页面,通过 FTP 上传发布到某门户网站的体育频道。系统中还一另另有有有三个 录入赛程(参赛队,运动员,出场2

顺序等)数据库的系统进程池池,运行在数据库服务器上。算下来整个系统有十来个系统进程池池,运行在二十多台设备

(PC 和 PDA)上,必须考虑可靠性。将来有并且把并且 小系统仔细讲一讲,挺有意思的。

这是我第一次写实际项目中的网络系统进程池池,当时写下来的感觉是像写命令行与用户交互的系统进程池池:系统进程池池

在命令行输出一句提示语,等待英文客户输入语录,并且处里客户输入,再输出下一句提示语,没办法 循环。

只不过这里的“客户”时会 人,并且原本系统进程池池。在建立好 TCP 连接以前,双方的系统进程池池时会 read/write

循环(为求简单,我用的是 blocking 读写),直到有一方断开连接。

第二次是 2010 年编写 muduo 网络库,我再次拿起了 Sockets API,写了一另另有有三个 基于 Reactor 模式的

C++ 网络库。写并且 库的目的之一并且想让日常的网络编程从 Sockets API 的琐碎细节中解脱出来,让程

序员专注于业务逻辑,把时间用在刀刃上。Muduo 网络库的示例代码中有 了十几条网络系统进程池池,那此程

序都没办法 直接使用 Sockets API。

在此之外,无论是实习还是工作,确实我写的系统进程池池时会通过 TCP 协议与并且 系统进程池池打交道,但我没办法

直接使用过 Sockets API。对于 TCP 网络编程,我认为核心是处里“一另另有有三个 半事件”,见《Muduo 网络编

程示例之零:前言》中的“TCP 网络编程本质论”。系统进程池池员的主要工作是在事件处里函数中实现业务逻

辑,而时会 和 Sockets API 较劲。

这里还是没办法 说清楚“网络编程”是那此,请继续阅读后文“网络编程的各种任务角色”。

学习网络编程有用吗?

以上说的是比较底层的网络编程,系统进程池池代码直接面对从 TCP 或 UDP 收到的数据以及构造数据包发

出去。在实际工作中,另一种常见 的情况是通过各种 client library 来与服务端打交道,并且在现成的框

架中填空来实现 server,并且采用更上层的通信办法。比如用 libmemcached 与 memcached 打交道,使

用 libpq 来与 PostgreSQL 打交道,编写 Servlet 来响应 http 请求,使用一种 RPC 与并且 系统进程池池通信,等等。

那此情况时会趋于稳定网络通信,但不一定算作“网络编程”。并且你的工作是前面列举的那此,学习

TCP/IP 网络编程还有用吗?

我认为还是有必要学一学,合适在 troubleshooting 的以前有用。无论你是用 libevent/netty/gevent

来写网络系统进程池池,还是用前述更高层库来通信,那此 library 或 framework 时会调用底层的 Sockets API 来

实现网络功能。当你的系统进程池池遇到一另另有有三个 线上现象,并且你熟悉 Sockets API,没办法 从 strace 先要发现系统进程池池卡

在哪里,尽管并且你没办法 直接调用那此 Sockets API。另外,熟悉 TCP/IP 协议、会用 tcpdump 也大大有

促使分析处里线上网络服务现象。

在那此平台上学习网络编程?

对于服务端网络编程,我建议在 Linux 上学习。

并且在 10 年前,并且 现象的答案或许是 FreeBSD,并且 FreeBSD 根正苗红,在 800 年那一次互联

网浪潮中扮演了重要角色,是要是 公司首选的免费服务器操作系统。800 年那会儿 Linux 还远未早熟期是什么是什么 是什么是什么是什么的句子的句子的句子的句子 期,

连 epoll 都还没办法 实现。(FreeBSD 在 801 年发布 4.1 版,加入了 kqueue,从此 C10k 时会 现象。)

10 年后的今天,事情起了变化,Linux 成为了市场份额最大的服务器操作系统

1

。在 Linux 并且 大众

系统上学网络编程,遇到那此现象会比较容易处里。并且用的人多,你遇到的现象别人多半也遇到过;

1

2

7