UNIX网络编程书中源代码测试环境搭建

    Steven在书中例子都包含一个#include "unip.h",从书中附录可以看出该头文件包含了网络程序中所使用到的各种相关头文件,所以如果想自己测试书中的源代码的话,我们需要需要搭建一个环境,以下是自己的实践过程,记录下来,以便以后参考:

1、下载书中源代码unpv13e.tar.gz:

这个可以在书中前言给出的地址下载:http://www.unpbook.com/unpv13e.tar.gz,如果该地址无法下的话,也可以在本博客资源地址下载:http://download.csdn.net/detail/ymsdu2004/4906181,在Steven的个人网站:http://www.kohala.com/start/也可以找到源代码,但遗憾的是我在上面找到的是本书第二版本的。


2、在你的工作目录下创建一个目录UnpStudy,然后进入该目录分别创建Inc,Unp1及Unp2目录,我这三个目录的作用分别是:Inc包含书中例子用到的头文件unp.h和config.h,而Unp1和Unp2目录分别用于存放书中卷1和卷2例子的源代码,每章节的例子分别放在ChapterX(X指代章节)中。

3、解压源代码:tar -xvf unpv13e.tar.gz到UnpStudy下得到一个目录unpv13e

4、执行以下命令编译代码得到一个libunp.a库文件(编译书中的例子需要依赖该库):
    cd unpv13e
    ./configure
    cd lib
    make
这样就在unpv13e目录中生成了libunp.a,接下来我们将该库文件复制到系统可以找到的路径中,我将它放到/usr/lib中:
    cp libunp.a /usr/lib
注意如果提示没有权限的话,请切换到root账户执行该命令。

5、最后将我们例子中要用到的头文件unp.h(在lib目录中)以及unp.h包含的头文件config.h(在unpv13e目录中)复制到Inc目录下。

6、unp.h中包含了config.h,犹豫我们将两个文件放在同一个目录中,所以需要修改一下unp.h中的头文件包含路径,即将#include "../config.h"改成#include "config.h",同时在unp.h中增加一句#define MAXLINE 2048

7、在ChapterX目录中编写我们的书中例子代码时,包含的unp.h的路径应该写成:#include "../../Inc/unp.h"

8、在编译书中例子代码时需要制定我们依赖的unplib.a库文件:

如书中第一章时间获取客户端例子:cc -o daytimeclient daytimeclient.c -lunp

以下是书中第一章节的简单例子:

// 客户端代码
#include "../../Inc/unp.h"

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(8080);
    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 "../../Inc/unp.h"                
#include <time.h>

int main(int argc, char** argv)
{
    int listenfd, connfd;
    struct sockaddr_in servaddr;
    char buff[MAXLINE];
    time_t ticks;

    listenfd = Socket(AF_INET, SOCK_STREAM, 0); 
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(8080);
    Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
    Listen(listenfd, LISTENQ);
    for (;;) {
        connfd = Accept(listenfd, (SA*)NULL, NULL);
        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        Write(connfd, buff, strlen(buff));
        Close(connfd);
    }   
    exit(0);
}

编译及测试过程如下:

UNIX网络编程书中源代码测试环境搭建_第1张图片

其中-lunp选项就是指定我们之前生成的libunp.a静态库。

你可能感兴趣的:(UNIX网络编程书中源代码测试环境搭建)