[Unix网络编程]1.2一个简单的时间获取客户程序
今天开始在Linux(Ubuntu)下面学习网络编程。学习的过程,总是会遇到很多问题,但是解决了,感觉很棒。
1、下载源代码,便于参考
http://www.ituring.com.cn/book/164?q=unix%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B
随书代码
2、下载完成后解压,打开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.
所谓的 src/ directory 指得是解压得文档。打开终端
cd /home/themo/下载/unpv13e (cd 后面得路径换成文件解压后的文件夹路径)
按照要求一次执行命令。如果担心打字错误,可以直接拷贝粘贴
执行./daytimetcpcli 127.0.0.1 可能会报错 “connection refused”.这是因为本机的tcp daytime服务没有启动。
3、启动daytime 服务。 参考自:http://blog.csdn.net/qpengyanting123/article/details/17503163
sudo apt-get install xinetd
cd /etc/xinetd.d
sudo vim daytime
(操作:)是将此文件中的两个 disable 的值 yes 改为 no
sudo stop xinetd (注释:重新启动xinetd服务)
sudo start xinetd
//注意权限得问题。daytime文件的权限 root "wr",所以需要获得root权限。sudo vim daytime
此时再次运行 ./daytimetcpcli 127.0.0.1 仍然显示“connection refused”,原因为启动了Ubuntu防火墙,没有允许13号端口。执行如下代码
sudo ufw allow 13
cd /home/themo/下载/unpv13e/intro (注释:替换成unpv13e所在的路径)
./daytimetcpcli 127.0.0.1
得到如下结果
23 MAR 2014 10:09:03 CST
服务配置成功!
4、至此环境就已经配置完成。开始编写第一个程序:1.2一个简单的时间获取客户程序
#include "unp.h" #include "error.c" //注意这是错误处理函数的头文件 int main(int argc,char *argv[]) { int sockfd, n; char recvline[MAXLINE+1]; struct sockaddr_in servaddr; if(argc != 2) err_quit("usage: a.out <IPaddress>"); if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0) err_sys("socket error"); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(13); if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) err_quit("inet_pton error for %s", argv[1]); if(connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) < 0) err_sys("connect error"); while((n = read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; if(fputs(recvline, stdout) == EOF) err_sys("fputs error"); } if(n < 0) err_sys("read error"); exit(0); }
注意书本上得代码没有添加错误处理函数的头文件,必须加上#include "error.c" 否则函数找不到定义。
编写源文件完成后,我们要进行编译的工作。关于Linux环境下C\C++的编译,推荐一本电子书给大家,总比在网上查阅良莠不齐的信息来得靠谱多了。
Google搜索: An Introduction to GCC.pdf
下面我们简单说明下Linux下C++的编译
移动到.cpp源文件所在得目录
g++ -o 输出文件名.out 源文件名.cpp (注释:执行后可以看到目录下出现:输出文件名.out 的文件)
./输出文件名.out (注释:执行程序)
本代码中用到了 #include "unp.h" 和 #include "error.c" 那编译器需要知道这两个文件存放在哪里。这两个文件存放在我们第1步下载得源码文件夹中。对于我得计算机来说是:
/home/themo/下载/unpv13e/lib 替换成你自己的路径
所以我们在编译 “一个简单的时间获取客户程序” 需要告诉编译器要包含得头文件所在的文件夹
具体细节参见:An Introduction to GCC.pdf Chapter 3
可用如下代码编译:
g++ -o get-time.out -g -Wall -I/home/themo/下载/unpv13e/lib get-time.cpp (注释:编译cpp)
./get-time.out 127.0.0.1 (注释:执行程序)
终端输出程序执行结果:
themo@themo:~/文档/network$ ./get-time.out 127.0.0.1 23 MAR 2014 11:55:34 CST
说明:
g++ C++编译指令
-o get-time.out 指定编译后得文件get-time.out,若未指定默认得到 a.out
-I/home/themo/下载/unpv13e/lib -I/包含路径,指定cpp中#include “” 的文件要到哪里找。
-g 添加调试信息,使用gdb调试时起作用
get-time.cpp 源文件名
如有不明白,欢迎提问。