1. 预备知识
从网络编程开始(基于 socket 套接字的编程),我们要用到很多很多在Linux 环境编程中学到的知识,比较典型的就是信号处理,多进程,多线程这些知识。如果你对这些东西感觉还是很模糊,后面学习起来会相当困难。我并不打算把这些知识在网络编程中重复,所以如果你对这些知识感觉很困惑,请跳到《Linux环境编程学习笔记》中学习。
另一方面,有关基本的网络编程基础,在《Linux环境编程学习笔记》中的第十四章,也就是从《128-字节序》开始讲起的,所以建议你提前预习下。
最后,希望你掌握本专题《Linux 网络编程学习笔记导航》的第一、二和三章,也就是前 31 篇有关 TCP 的内容。因为后面的网络编程,大多数都是围绕 TCP 协议来的,如果你对 TCP 协议不了解,后面很多编程相关的细节,你可能会懵圈。
2. 网络编程概述
网络编程中,往往代码量都比较大,细节处理也相当多,所以再也不能像 Linux 环境编程学习笔记里那样直接贴代码了,但是我会贴少部分关键代码。另一方面,我会把所有用到的例子放在 gitos 上,地址在下面:
https://git.oschina.net/ivan_allen/unp.git
这个地址我在前面已经贴出过,如果你没忘记的话。所有的网络编程相关的代码在文件夹 unp/program
下面。
图1 展示的部分文件
特别注意的是,有两个文件是共用的,其中一个是头文件 include/common.h
,另一个是util/common.cc
,它提供了很多已经封装好的函数,比如 readn
、writen
等等,再后面的学习中,我还会继续扩充它。
3. 启航
3.1 代码托管
接下来,请在你的 Linux 中键入:
git clone https://git.oschina.net/ivan_allen/unp.git
等待下载完成后,阅读 unp/program/echo/basic/echo.cc
这份代码,作为你的起点。这份代码不长,一共 117 行,如果后面我没改动的话^_^.
【注】因为代码随时都在变化,所以你可能随时都得更新一下代码库,具体方法是:
git pull
编译方式,这个太简单,直接在命令行输入:
$ make
3.2 程序说明
可能你会想,网络编程一般不是有两份程序,一个服务器一个客户端吗?没错,为了防止文件过多,我将服务器和客户端放到了一个文件里,通过命令参数来控制它是以服务器方式启动还是以客户端的方式启动。比如在这个 basic 例子里,主要通过参数 -s 来指名。
如果以服务器方式启动,我就键入 ./echo -s -h 192.168.166.47 -p 8000
,表示在 192.168.166.47 这个地址,8000 这个端口监听。如果键入 ./echo -h 192.168.166.47 -p 8000
,就表示以客户端方式启动,它尝试去连接 192.168.166.47:8000.
3.3 几个常用的函数
第一份程序可能会让你阅读困难,因为这里封装了很多函数,还有一些宏,比较典型有的 main 函数参数的解析 parsecmdline
这样的函数,这里你可不必花太多心思在上面,知道怎么用就行了。
需要关心的几个函数是:
resolve
:封装套接字地址的函数,这个函数的第一个参数既可以接收主机名,也可以接收一个点分十进制的 ip 地址;第二个参数表示端口号;第三个参数是一个输出参数,也就是充当返回值的作用。readn
: 表示读取固定 n 个字节的的数据,它的返回值表示实际读取的字节数,如果为 -1 表示错误。如果读取的字节数少于指定的值,则表示对端关闭。readline
:表示读取一行,也就是读取到以\n
字节结尾为止就返回,返回值表示实际读取的字节数。writen
:表示写入 n 个字节,返回实际写入的字节数,如果返回 -1,表示遇到错误,如果返回的字节数小于 n,表示遇到short write
情况,这个后面会讲。
4. 总结
- 仔细阅读第一份程序
basic/echo.cc