练习45:一个简单的TCP/IP客户端

    我打算使用来创建一个非常简单的小型网络测试工具,叫做netclient。为此我需要向Makefile添加一些工具,来处理bin/目录下的小程序。

    首先,为程序添加一些变量,就像单元测试的TESTSTEST_SRC变量:

    之后你可能想要添加PROGRAMS到所有目标中:

    1. all: $(TARGET) $(SO_TARGET) tests $(PROGRAMS)

    最后你还需要在最后添加一个目标来构建它们:

    1. $(PROGRAMS): CFLAGS += $(TARGET)

    做了这些修改你就能够将.c文件扔到bin中,并且编译它们以及为其链接库文件,就像测试那样。

    netclient的代码是这样的:

    代码中使用了select来处理(文件描述符0)和用于和服务器交互的socket中的事件。它使用了RingBuffer来储存和复制数据,并且你可以认为read_somewrite_some函数都是RingBuffer中相似函数的原型。

    如果你完成了所有构建,测试的最快方式就是看看你能否从learncodethehardway.org上得到一个特殊的文件:

    1. $
    2. GET /ex45.txt HTTP/1.1
    3. Host: learncodethehardway.org
    4. HTTP/1.1 200 OK
    5. Date: Fri, 27 Apr 2012 00:41:25 GMT
    6. Content-Type: text/plain
    7. Content-Length: 41
    8. Server: Mongrel2/1.7.5
    9. Learn C The Hard Way, Exercise 45 works.
    10. ^C
    11. $

    这里我所做的事情是键入创建/ex45.txt的HTTP请求所需的语法,在Host:请求航之后,按下ENTER键来输入空行。接着我获取相应,包括响应头和内容。最后我按下CTRL-C来退出。

    这段代码肯定含有bug,但是当前在本书的草稿中,我会继续完成它。与此同时,尝试分析代码,并且用其它服务器来击溃它。一种叫做netcat的工具可以用于建立这种服务器。另一种方法就是使用PythonRuby之类的语言创建一个简单的“垃圾服务器”,来产生垃圾数据,随机关闭连接,或者其它异常行为。

    如果你找到了bug,在评论中报告它们,我会修复它。

    • 像我提到的那样,这里面有一些你不知道的函数,去查询他们。实际上,即使你知道它们也要查询。
    • valgrind下运行它来寻找错误。
    • 为函数添加各种防御性编程检查,来改进它们。