高级C与网络编程复习(1)—— Introduction(第一章

2020-04-23  本文已影响0人  SunnyQjm

Introduction

  • A Simple Daytime Client
  • A Simple Daytime Server

A Simple Daytime Client

#include <unp.h>

int main(int argc, char** argv){
    /*sockfd 套接字描述符,客户端通过该描述符与服务器进行通信(它指示一个与服务器的连接)*/
    int sockfd, n;
    char recvline[MAXLINE + 1];         /*接收缓存*/

    /*服务器地址,用来保存服务器的地址信息(该结构体专门保存IPV4地址),包括ip和端口*/
    struct sockaddr_in servaddr;

    /*如果输入参数不够,则报错并退出*/
    if(argc != 2)
        err_quit("usage: daytimecli <IPAddress>");

    /*通过socket函数创建一个套接字,创建失败则退出*/
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)
        err_sys("socket error");

    /*清0*/
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;      /*指定协议族为网际协议族*/
    servaddr.sin_port = htons(13);      /*指定端口为13*/

    /*将用户从命令行输入的IP存到servaddr中,如果用户输入的格式不正确*/
    /*则该函数会返回小于0的错误信息,此时退出应用程序*/
    if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
        err_quit("inet_pton error for %s", argv[1]);

    /*连接到servaddr指向的服务器,连接失败则退出*/
    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);
}

一些关于教材的扩展介绍

A Simple Daytime Server

#include <unp.h>
#include <time.h>

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

    //调用包裹函数,创建一个socket
    listenfd = Socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(13);

    //指定socket的地址为INADDR_ANY,标识监听来自所有地址的请求
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    //将socket绑定到指定的端口,只在指定的端口监听来自客户端的请求
    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

    //调用Lisen可将socket转换成一个监听套接字,监听套接字可用于监听其他客户端的请求
    Listen(listenfd, LISTENQ);

    for( ; ; ){
        //accpet函数是一个阻塞函数,死等一个连接请求。
        //当监听到一个请求,就返回一个已连接描述符(该描述符用于与新连接的那个客户端通信)
        connfd = Accept(listenfd, (SA *) NULL, NULL);

        //获取当前系统的时间
        ticks = time(NULL);

        //将当前时间输出到buff数组中
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));

        //将buff中的数据发给客户端
        Write(connfd, buff, strlen(buff));

        //关闭socket连接
        Close(connfd);
    }
}
  • A Simple Daytime Client
  • A Simple Daytime Server

A Simple Daytime Client

#include <unp.h>

int main(int argc, char** argv){
    /*sockfd 套接字描述符,客户端通过该描述符与服务器进行通信(它指示一个与服务器的连接)*/
    int sockfd, n;
    char recvline[MAXLINE + 1];         /*接收缓存*/

    /*服务器地址,用来保存服务器的地址信息(该结构体专门保存IPV4地址),包括ip和端口*/
    struct sockaddr_in servaddr;

    /*如果输入参数不够,则报错并退出*/
    if(argc != 2)
        err_quit("usage: daytimecli <IPAddress>");

    /*通过socket函数创建一个套接字,创建失败则退出*/
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)
        err_sys("socket error");

    /*清0*/
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;      /*指定协议族为网际协议族*/
    servaddr.sin_port = htons(13);      /*指定端口为13*/

    /*将用户从命令行输入的IP存到servaddr中,如果用户输入的格式不正确*/
    /*则该函数会返回小于0的错误信息,此时退出应用程序*/
    if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
        err_quit("inet_pton error for %s", argv[1]);

    /*连接到servaddr指向的服务器,连接失败则退出*/
    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);
}

一些关于教材的扩展介绍

A Simple Daytime Server

#include <unp.h>
#include <time.h>

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

    //调用包裹函数,创建一个socket
    listenfd = Socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(13);

    //指定socket的地址为INADDR_ANY,标识监听来自所有地址的请求
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    //将socket绑定到指定的端口,只在指定的端口监听来自客户端的请求
    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

    //调用Lisen可将socket转换成一个监听套接字,监听套接字可用于监听其他客户端的请求
    Listen(listenfd, LISTENQ);

    for( ; ; ){
        //accpet函数是一个阻塞函数,死等一个连接请求。
        //当监听到一个请求,就返回一个已连接描述符(该描述符用于与新连接的那个客户端通信)
        connfd = Accept(listenfd, (SA *) NULL, NULL);

        //获取当前系统的时间
        ticks = time(NULL);

        //将当前时间输出到buff数组中
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));

        //将buff中的数据发给客户端
        Write(connfd, buff, strlen(buff));

        //关闭socket连接
        Close(connfd);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读