Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6271002
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2013-09-07 01:55:03

运行书本中的程序。
方法一、
1,首先,下载源码:unpv13e.tar.gz

2,然后,编译程序,方法如下:(具体编译方法可以看unpv13e中的README文档)

    tar -zxvf  unpv13e.tar.gz (-C dir)//解压文件

    cd    unpv13e
    ./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
  (在我的电脑上这两个make没有通过,也不要紧,看后面的注释可以看到它们对应于特定的平台才会通过,这里不影响我们编译该客户端服务器时间日期程序)
 接着往下:

    cd ../intro    # build and test a basic client program
  
  make daytimetcpsrv
   此时会生成   daytimetcpsrv daytimetcpsrv.o 
<用gcc -o  daytimetcpsrv   daytimetcpsrv.c编译会出错>
  (这一步在README文件中没有写出,要注意!!!!假如我们没有执行make daytimetcpsrv,而是直接执行make daytimetcpcli,然后输入 ./daytimetcpcli 127.0.0.1 后发现报错;Connection Refused。上网google了一下解决了这个问题,原来是因为这个版本的系统默认是不开daytime服务的,而且开启daytime服务需要有root权限,然后你会看到在相同的目录下有一个daytimetcpsrv.c文件,编译(make daytimetcpsrv)后执行它,注意需要有root权限,即sudo   ./daytimetcpsrv。它的功能就是开启本机的daytime服务,然后你再开启一个终端,敲击./daytimetcpcli 127.0.0.1后返回了你想要的结果。

    make daytimetcpcli
<用gcc -o  daytimetcpcli   daytimetcpcli.c编译会出错>
此时会生成  daytimetcpcli daytimetcpcli.o


3、linux现在因为安全问题,各个发行版本默认是不开daytime服务的。  
   
  第一个例子实际上是两个程序,客户端和服务端,你很有可能只运行了客户端,没有运行服务端程序。  
   
  服务端程序在书上第12页……你不会尚还没有看到那里吧?  
   
  PS:由于要打开端口,所以服务端程序需要用root权限执行,所以你可以先   

    sudo   ./daytimetcpsrv  (如果本身就是root就不需要sudo)<要打开小于1024端口的服务,要用root才能执行>

  然后再开一个终端运行   ./daytimetcpcli 127.0.0.1  就可以看到返回的时间了  


方法二、自己编写代码
  自己编写的包裹函数代码如下:

  1. //unp.h
  2. #include<sys/socket.h>
  3. #include<stdlib.h>

  4. #define SA struct sockaddr
  5. #define LISTENQ 1024

  6. int Socket(int family,int type,int protocol)
  7. {
  8.     int n;
  9.     if((n=socket(family,type,protocol))<0)
  10.     {
  11.         printf("socket error");
  12.         exit(-1);
  13.     }
  14.     printf("baoguohanshutiaoyongle\n");
  15.     return n;
  16. }

  17. int Bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen)
  18. {
  19.     int n;
  20.     if((n=bind(sockfd,myaddr,addrlen))<0)
  21.     {
  22.         printf("bind error\n");
  23.         exit(-1);
  24.     }
  25.     return n;
  26. }


  27. int Connect(int sockfd,const struct sockaddr*servaddr,socklen_t addrlen)
  28. {
  29.     int n;
  30.     if(( n=connect(sockfd,servaddr,addrlen)<0)
  31.     {
  32.         printf("connect to server error\n");
  33.         exit(-1);
  34.     }
  35.     return n;
  36. }


  37. int Accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)
  38. {
  39.      int n;
  40.      if((n=accept(sockfd,cliaddr,addrlen))<0)
  41.      {
  42.          printf("accept error\n");
  43.          exit(-1);
  44.      }
  45.      return n;
  46. }
daytimetcpcli.c代码如下:
 
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<unistd.h>
  4. #include<strings.h>
  5. #include<sys/socket.h>
  6. #include<netinet/in.h>
  7. #include "unp.h"

  8. #define MAXLINE 4096

  9. int main(int argc,char **argv)
  10. {
  11.     int sockfd,n;
  12.     struct sockaddr_in servaddr;
  13.     char recvline[MAXLINE+1];

  14.     if(argc!=2)
  15.     {
  16.         printf("usage:a.out ");
  17.         exit(-1);
  18.     }

  19.     sockfd=Socket(AF_INET,SOCK_STREAM,0);
  20.     
  21.     bzero(&servaddr,sizeof(servaddr));
  22.     servaddr.sin_family=AF_INET;
  23.     servaddr.sin_port=htons(13);
  24.     if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)
  25.     {
  26.         printf("inet_pton error for %s\n",argv[1]);
  27.         exit(-1);
  28.     }
  29.      
  30.     Connect(sockfd,(SA*)&servaddr,sizeof(servaddr));
  31.    
  32.     while((n=read(sockfd,recvline,MAXLINE))>0)
  33.     {
  34.         printf("read %d words from sockfd\n",n);
  35.         recvline[n]=0;
  36.         if(fputs(recvline,stdout)==EOF)
  37.         {
  38.              printf("fputs error\n");
  39.              exit(-1);

  40.         }
  41.               
  42.     }
  43.     if(n<0)
  44.     {
  45.         printf("read error\n");
  46.         exit(-1);
  47.     }
  48.     exit(0);
  49. }
daytimetcpserv.c代码如下:
 
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<unistd.h>
  4. #include<time.h>
  5. #include<string.h>
  6. #include<strings.h>
  7. #include "unp.h"
  8. #include<netinet/in.h>
  9. #include<sys/socket.h>

  10. #define LISTENQ 1024
  11. #define MAXLINE 4096

  12. int main(int argc,char **argv)
  13. {
  14.     int n;
  15.     int listenfd,connfd;
  16.     time_t ticks;
  17.     socklen_t len;
  18.     char buff[MAXLINE];
  19.     struct sockaddr_in cliaddr,servaddr;

  20.     listenfd=Socket(AF_INET,SOCK_STREAM,0);
  21.   
  22.     bzero(&servaddr,sizeof(servaddr));

  23.     servaddr.sin_family=AF_INET;
  24.     servaddr.sin_port=htons(13);
  25.     servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  26.     Bind(listenfd,(SA*)&servaddr,sizeof(servaddr));
  27.     listen(listenfd,LISTENQ);
  28.     for( ; ; )
  29.     {
  30.          len=sizeof(cliaddr);
  31.          connfd=Accept(listenfd,(SA*)&cliaddr,&len);
  32.          printf("connection from %s,port %d\n",
  33.          inet_ntop(AF_INET,&cliaddr.sin_addr,buff,sizeof(buff)),
  34.          ntohs(cliaddr.sin_port));
  35.             
  36.          ticks=time(NULL);
  37.          snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
  38.          n= write(connfd,buff,strlen(buff));
  39.          printf("actually write %d words to connfd\n",n);
  40.          close(connfd);
  41.     }
  42. }
注意:小于1024的端口要有root权限才能带开,因此在运行服务器端时,要切换为root用户。或者是有sudo是普通用户有root权限也可以。



阅读(348) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~