环境:
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
如果出现权限不够,则如下修改文件权限(我比较偷懒,把所有文件都面向广大人民开放了)
然后子运行“./congfigure”命令,设置过程如下图所示:
然后进入“lib”文件夹,运行“make”命令:
再进入“libfree”文件夹,运行“make”命令:
如此,就一切准备就绪了(还有几个命令是针对其他系统环境的,在这就不说了)。
此时,可以直接进入“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):
接着运行客户端获取服务器系统时间,如下所示:
OK,第一张程序例子到此结束!