zoukankan      html  css  js  c++  java
  • UNP学习笔记(第一章 简介)

    环境搭建

    1.下载解压unpv13e.tar.gz

    2.进入目录执行

    ./configure
    cd lib //进入lib目录
    make //执行make命令

    3.将生成的libunp.a静态库复制到/usr/lib/和/usr/lib64/中  

    cd ..   //返回unpv13e目录
    sudo cp libunp.a /usr/lib sudo cp libunp.a /usr/lib64

    4.修改unp.h并将其和config.h拷贝到/usr/include中,为了以后include方便

    vi lib/unp.h   
    //将unp.h中#include "../config.h"修改为#include "config.h"  
    sudo cp lib/unp.h /usr/include  
    sudo cp config.h /usr/include  

    5.编译源代码

    cd ./intro  
    gcc -o daytimetcpcli daytimetcpcli.c -lunp

    跟普通的编译不一样的是要在最后加上刚才那个链接库,-l参数加上刚才那个libunp.a去掉lib和后面的.a。最后得到参数-lunp。

    下面是socket网络编程的实例,代码将在后面章节进行详细说明

    一个简单的时间获取客户程序

     1 #include    "unp.h"
     2 
     3 int
     4 main(int argc, char **argv)
     5 {
     6     int                    sockfd, n;
     7     char                recvline[MAXLINE + 1];
     8     struct sockaddr_in    servaddr;
     9 
    10     if (argc != 2)
    11         err_quit("usage: a.out <IPaddress>");
    12 
    13     if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    14         err_sys("socket error");
    15 
    16     bzero(&servaddr, sizeof(servaddr));
    17     servaddr.sin_family = AF_INET;
    18     servaddr.sin_port   = htons(13);    /* daytime server */
    19     if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
    20         err_quit("inet_pton error for %s", argv[1]);
    21 
    22     if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
    23         err_sys("connect error");
    24 
    25     while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
    26         recvline[n] = 0;    /* null terminate */
    27         if (fputs(recvline, stdout) == EOF)
    28             err_sys("fputs error");
    29     }
    30     if (n < 0)
    31         err_sys("read error");
    32 
    33     exit(0);
    34 }
    View Code

    上面是TCP当前时间查询客户程序的一个实现。该客户与服务器建立一个TCP连接后,服务器以直观可读格式简单地送回当前时间和日期。

    协议无关性

    上面程序与IPv4协议相关。修改该程序,让它能够在IPv6运行

     1 #include    "unp.h"
     2 
     3 int
     4 main(int argc, char **argv)
     5 {
     6     int                    sockfd, n;
     7     struct sockaddr_in6    servaddr;
     8     char                recvline[MAXLINE + 1];
     9 
    10     if (argc != 2)
    11         err_quit("usage: a.out <IPaddress>");
    12 
    13     if ( (sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
    14         err_sys("socket error");
    15 
    16     bzero(&servaddr, sizeof(servaddr));
    17     servaddr.sin6_family = AF_INET6;
    18     servaddr.sin6_port   = htons(13);    /* daytime server */
    19     if (inet_pton(AF_INET6, argv[1], &servaddr.sin6_addr) <= 0)
    20         err_quit("inet_pton error for %s", argv[1]);
    21 
    22     if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
    23         err_sys("connect error");
    24 
    25     while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
    26         recvline[n] = 0;    /* null terminate */
    27         if (fputs(recvline, stdout) == EOF)
    28             err_sys("fputs error");
    29     }
    30     if (n < 0)
    31         err_sys("read error");
    32 
    33     exit(0);
    34 }
    View Code

    包裹函数

    本书例子通过包裹函数来进行错误处理:约定包裹函数名是实际函数名的首字母大写形式,例如Socket函数是socket的包裹函数,下面代码将演示这个包裹函数

    1 int
    2 Socket(int family, int type, int protocol)
    3 {
    4     int n;
    5     if( (n = socket(family, type, protocol)) < 0)
    6         err_sys("socket error");
    7     return (n);
    8 }
    View Code

    一个简单的时间获取服务器程序

     1 #include    "unp.h"
     2 #include    <time.h>
     3 
     4 int
     5 main(int argc, char **argv)
     6 {
     7     int                    listenfd, connfd;
     8     struct sockaddr_in    servaddr;
     9     char                buff[MAXLINE];
    10     time_t                ticks;
    11 
    12     listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    13 
    14     bzero(&servaddr, sizeof(servaddr));
    15     servaddr.sin_family      = AF_INET;
    16     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    17     servaddr.sin_port        = htons(13);    /* daytime server */
    18 
    19     Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    20 
    21     Listen(listenfd, LISTENQ);
    22 
    23     for ( ; ; ) {
    24         connfd = Accept(listenfd, (SA *) NULL, NULL);
    25 
    26         ticks = time(NULL);
    27         snprintf(buff, sizeof(buff), "%.24s
    ", ctime(&ticks));
    28         Write(connfd, buff, strlen(buff));
    29 
    30         Close(connfd);
    31     }
    32 }
    View Code

    测试程序

    使用root用户使服务器程序从后台运行

    运行第一个客户端程序

    127.0.0.1是环回地址。本例子中客户端程序连接到服务器程序,服务器程序将时间跟日期发送给客户端,然后客户端将它打印到终端中。

  • 相关阅读:
    004---基于TCP的套接字
    003---socket介绍
    002---tcp/ip五层详解
    001---C/S架构
    008---re正则模块
    007---logging日志模块
    006---hashlib模块
    005---json & pickle
    004---os & sys
    22.解决 eclipse 与 AS 共用 SDK 导致 eclipse ADT 无法使用的问题
  • 原文地址:https://www.cnblogs.com/runnyu/p/4655650.html
Copyright © 2011-2022 走看看