第一章 简介和TCP/IP

来源:互联网 发布:手机游戏编程培训 编辑:程序博客网 时间:2024/05/29 09:12

最近在看《Unix网络编程》打算记录下读书过程,用于鞭策自己不要懈怠。

搭建环境

首先是编译环境的搭建,我用的是vm 12 pro+centos7,然后下载源代码 unpv13e.tar.gz
然后解压源代码:tar -xzvf unpv13e.tar.gz
然后查看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.1If all that works, you're all set to start compiling individual programs.

接着按照顺序来执行上面的命令。
我在执行
cd ../libfree
make
之后出错了:

inet_ntop.c: In function ‘inet_ntop’:inet_ntop.c:60:9: error: argument ‘size’ doesn’t match prototype  size_t size;         ^In file included from inet_ntop.c:27:0:/usr/include/arpa/inet.h:64:20: error: prototype declaration extern const char *inet_ntop (int __af, const void *__restrict __cp,                    ^make: *** [inet_ntop.o] Error 1

于是,vim inet_ntop.c ,将第60行的 size_t size 改成 socklen_t size; ,再重新make即可。
接下来又出错:

[root@yao libfree]# cd ../libroute/[root@yao libroute]# makegcc -I../lib -g -O2 -D_REENTRANT -Wall   -c -o get_rtaddrs.o get_rtaddrs.cIn file included from get_rtaddrs.c:1:0:unproute.h:3:45: fatal error: net/if_dl.h: No such file or directory #include <net/if_dl.h>  /* sockaddr_sdl{} */                                             ^compilation terminated.make: *** [get_rtaddrs.o] Error 1

好吧,先把编译问题放到一边,直接

[root@yao unpv13e]# cd intro/[root@yao intro]# make daytimetcpcligcc -I../lib -g -O2 -D_REENTRANT -Wall   -c -o daytimetcpcli.o daytimetcpcli.cgcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli daytimetcpcli.o ../libunp.a -lpthread[root@yao intro]# ./daytimetcpcli 127.0.0.1connect error: Connection refused[root@yao intro]# ./daytimetcpcli 127.0.0.1connect error: Connection refused

然后发现daytime服务没开启,centos中开启daytime服务:

[root@yao intro]#  yum install xinetd[root@yao intro]# vim /etc/xinetd.d/daytime-stream //*将disable改为no*[root@yao intro]# vim /etc/xinetd.d/daytime-dgram //*将disable改为no*[root@yao intro]# service xinetd restartRedirecting to /bin/systemctl restart  xinetd.service[root@yao intro]# ./daytimetcpcli 127.0.0.112 JUN 2016 10:28:58 CST

于是搞定了。


1.2

这里面的好多函数都是后面章节会介绍的,先了解一下。

#include    "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(13);    /* daytime server 端口 */    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)//将IP转换为合适的格式        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;    /* null terminate */        if (fputs(recvline, stdout) == EOF)            err_sys("fputs error");    }    if (n < 0)        err_sys("read error");    exit(0);}
0 0
原创粉丝点击