织网的时日里——第一章:TCP时间获取之客户端和服务器端程序

织网的日子里——第一章:TCP时间获取之客户端和服务器端程序

环境:

Ubuntu10.04

g++ / gcc 4.4.3


特别标注:

有些网站转载我的文章不标明出处,并且转载不到位,没有把相应的链接一块转过去,比如说下载链接或相关文献的链接等,导致一些网友阅读和使用出现障碍和知识的不连续,所以在此特别标注:我的这篇文章发表在CSDN—— jasonque的博客上,可以到CSDN博客来阅读。


正文:

开始啃《UNIX网络编程:卷1》.

看完第一章,下载本书源码,刚开始运行程序就大受打击,不是少这文件就是少那个。看到源码文件夹里面的文件和文件夹挺多的,一下子蒙了,不知从何下手,第一章的源码文件在“intro”文件夹里面,直接在终端输入“make”命令,出来就是错误。惨呀。网上找资料,好像如此白痴的问题“高手”都不愿意详谈。无奈,还是靠自己吧。

回来看看源码文件夹,发现有一个“README”的文件,之前都没有阅读这个文件的习惯,因为很多东西的README文件,里面尽是广告或者就是一大篇看着好像不相关的内容。但这里不然,必须得小心地看看啦,能救命呀!!!!

------README--------

QUICK AND DIRTY
===============

Execute the following from the src/ directory:

    ./configure    # try to figure out all implementation differences

    cd lib         # build the basic library that all programs need
    make           # use "gmake" everywhere on BSD/OS systems

    cd ../libfree  # continue building the basic library
    make

    cd ../libroute # only if your system supports 4.4BSD style routing sockets
    make           # only if your system supports 4.4BSD style routing sockets

    cd ../libxti   # only if your system supports XTI
    make           # only if your system supports XTI

    cd ../intro    # build and test a basic client program
    make daytimetcpcli
    ./daytimetcpcli 127.0.0.1

If all that works, you're all set to start compiling individual programs.

Notice that all the source code assumes tabs every 4 columns, not 8.
上面说得很清楚了。在终端里,进入源码文件夹,运行命令:

# ./configure

如果出现权限不够,则如下修改文件权限(我比较偷懒,把所有文件都面向广大人民开放了)

织网的时日里——第一章:TCP时间获取之客户端和服务器端程序

然后子运行“./congfigure”命令,设置过程如下图所示:

织网的时日里——第一章:TCP时间获取之客户端和服务器端程序

然后进入“lib”文件夹,运行“make”命令:

织网的时日里——第一章:TCP时间获取之客户端和服务器端程序

再进入“libfree”文件夹,运行“make”命令:

织网的时日里——第一章:TCP时间获取之客户端和服务器端程序

如此,就一切准备就绪了(还有几个命令是针对其他系统环境的,在这就不说了)。


此时,可以直接进入“intro”文件夹,直接运行“make”命令,就可以得到最终的运行文件了。

但这里我要说一下,一路下来,我发现都让“README”给带傻了,只要有妹(make)就行,那我纯粹就是只会把妹而不会思考的“禽兽”了。

由于只用到客户端和服务器端两个程序,也就是两个.c源码文件,那我干嘛要把所有的.c文件全都编译出来?那怎样去控制只编译这两个文件?当然,直接用gcc命令编译两个源码文件是可能的,但里面相关库连接要做修改。另外一个,如果以后要写出好程序,特别是大程序,最好是对Makefile文件有深入了解。当然,不能一口吃成个大胖子,那咱就一口一口地来。

期间,拜读了CSDN中陈皓博主关于Makefile的系列文章《跟我一起写Makefile》,简洁易懂。之后,再回来看这个源码文件,其实经过前期不断地把妹(make),相关的库已经就绪,并且每一个分类文件夹里面也都有一个Makefile文件,打开intro文件夹里的Makefile,相当简单,把不相关的代码注释掉,留下自己感兴趣的,如下所示:

--------------intro/Makefile------------------------

include ../Make.defines

PROGS =	daytimetcpcli daytimetcpsrv
#daytimetcpcli1 daytimetcpcli2 daytimetcpcli3 \
#		daytimetcpsrv daytimetcpsrv1 daytimetcpsrv2 daytimetcpsrv3 \
#		daytimetcpcliv6 daytimetcpsrvv6 \
#		byteorder

all:	${PROGS}

daytimetcpcli:	daytimetcpcli.o
		${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS}

#daytimetcpcli1:	daytimetcpcli1.o
#		${CC} ${CFLAGS} -o $@ daytimetcpcli1.o ${LIBS}

#daytimetcpcli2:	daytimetcpcli2.o
#		${CC} ${CFLAGS} -o $@ daytimetcpcli2.o ${LIBS}

#daytimetcpcli3:	daytimetcpcli3.o
#		${CC} ${CFLAGS} -o $@ daytimetcpcli3.o ${LIBS}

daytimetcpsrv:	daytimetcpsrv.o
		${CC} ${CFLAGS} -o $@ daytimetcpsrv.o ${LIBS}

#daytimetcpsrv1:	daytimetcpsrv1.o
#		${CC} ${CFLAGS} -o $@ daytimetcpsrv1.o ${LIBS}

#daytimetcpsrv2:	daytimetcpsrv2.o
#		${CC} ${CFLAGS} -o $@ daytimetcpsrv2.o ${LIBS}

#daytimetcpsrv3:	daytimetcpsrv3.o
#		${CC} ${CFLAGS} -o $@ daytimetcpsrv3.o ${LIBS}

#daytimetcpcliv6:	daytimetcpcliv6.o
#		${CC} ${CFLAGS} -o $@ daytimetcpcliv6.o ${LIBS}

#daytimetcpsrvv6:	daytimetcpsrvv6.o
#		${CC} ${CFLAGS} -o $@ daytimetcpsrvv6.o ${LIBS}

#byteorder:	byteorder.o
#		${CC} ${CFLAGS} -o $@ byteorder.o ${LIBS}

clean:
		rm -f ${PROGS} ${CLEANFILES}

保存Makefile文件之后,在终端运行make命令,就可以编译出自己需要的客户端和服务器端两个运行文件了。

至于整个大的源码文件的Makefile文件架构,那就先别急着分析,一步一步来,至少现在修改的这些是足够使用和有价值的。跟着书走,一个一个源码分析过一遍之后,再来分析整个Makefile文件架构,那时思路就会更清晰,收获会更大。

对于源码文件和对其的分析在这就不表了,书里面讲得很明白。直接运行程序,看看结果如何吧。

首先运行服务器端,如下所示,运行之后会处于一个阻塞等待状态,(程序里面是一个死循环,要退出程序只能来硬的了——Ctrl+C):

织网的时日里——第一章:TCP时间获取之客户端和服务器端程序


接着运行客户端获取服务器系统时间,如下所示:

织网的时日里——第一章:TCP时间获取之客户端和服务器端程序


OK,第一张程序例子到此结束!