谈一谈网络编程学习经验

  • 时间:
  • 浏览:0

7

6

建议朋友儿去看原文:http://cloud.github.com/downloads/chenshuo/documents/LearningNetworkProgramming.pdf

9

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,其

他后来一定会使用封装好的网络库。

第一次是 4005 年在学校做一个羽毛球赛场计分系统:我用 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 根正苗红,在 4000 年那一次互联

网浪潮中扮演了重要角色,是所以公司首选的免费服务器操作系统。4000 年那会儿 Linux 还远未心智心智成熟 图片 图片 的句子的句子 图片 是什么是什么,

连 epoll 都还如此了实现。(FreeBSD 在 4001 年发布 4.1 版,加入了 kqueue,从此 C10k 一定会问題。)

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

1

。在 Linux 其他大众

系统上学网络编程,遇到哪些地方问題会比较容易处里。可能用的人多,你遇到的问題别人多半也遇到过;

1

2

5

8