linux下TCP协议客户端/服务器,UNIX网络编程卷1第一个时间获取程序简化版

完全简化,没有检查各函数返回值

客户端:

#include <time.h>  /* old system? */

#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <errno.h>
#include <fcntl.h>  /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h>  /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>

int
main(int argc, char **argv) {
    int sockfd, n;
    char recvline[4096 + 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(5000); /* daytime server */ //13
    if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0) 
    //if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)//终端运行时以命令行第二个参数作为ip地址
        ;
    //err_quit("inet_pton error for %s", argv[1]);

    if (connect(sockfd, (sockaddr *) & servaddr, sizeof (servaddr)) < 0)
        ;
    //err_sys("connect error");
    
    /*
     * 执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;
     * 标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。
     */

    while ((n = read(sockfd, recvline, 4096)) > 0) {
        recvline[n] = 0; /* null terminate */
        if (fputs(recvline, stdout) == EOF)//stdout(Standardoutput)标准输出,指屏幕; EOF表示输出失败
            ;
        //err_sys("fputs error");
    }
    if (n < 0)
        ;
    //err_sys("read error");

    exit(0);
}

服务器:

//#include	"unp.h"
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <errno.h>
#include <fcntl.h>  /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h>  /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>
#include <time.h>

int
main(int argc, char **argv) {
    int listenfd, connfd;
    struct sockaddr_in servaddr;
    char buff[4096];
    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(5000); /* daytime server */ //13,书上用着13端口,需要在root权限下运行服务器

    bind(listenfd, (sockaddr *) & servaddr, sizeof (servaddr));

    listen(listenfd, 1024);

    for ( ; ; ) {
        connfd = accept(listenfd, (sockaddr *) NULL, NULL);

        ticks = time(NULL);
        snprintf(buff, sizeof (buff), "%.24s %s\r\n", ctime(&ticks),"中国");
        write(connfd, buff, strlen(buff));

        close(connfd);
    }
}

输出:

Fri Sep  7 11:35:30 2018 中国

猜你喜欢

转载自blog.csdn.net/holyweng/article/details/82494065