[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  源文件名

 

如有不明白,欢迎提问。

 

posted on 2014-03-23 10:34  themo  阅读(391)  评论(0编辑  收藏  举报

导航