UNIX网络编程:第1章 一个简单的时间获取客户程序+服务程序

UNIX网络编程:第1章 一个简单的时间获取客户程序+服务程序

客户程序:

// 1.2 一个简单的时间获取客户程序
// timeget.cpp

#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define	MAXLINE		4096	/* max text line length */

void err_sys(const char *msg)
{
    printf("%s \n", msg);
    exit(1);
}


int main(int argc, char **argv)
{
    int    sockfd, n;
    char   recvline[MAXLINE + 1];
    struct sockaddr_in servaddr;

    if (argc != 2)
        err_sys("usage: a.out <IPaddress> ");

    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        err_sys("socket error! \n");

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(13);  /* day time server */
    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
        printf("inet_pton error for %s \n", argv[1]);

    if (connect(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr)) < 0)
        err_sys("connect error \n");

    while( (n = read(sockfd, recvline, MAXLINE)) > 0)
    {
        recvline[n] = 0;    /* null terminate */
        if (fputs(recvline, stdout) == EOF)
            err_sys("fputs error! \n");
    }
    if( n<0 )
        err_sys("read error! \n");

    exit(0);
}

服务程序:

// 1.5 一个简单的时间获取服务程序
// timeserver.cpp

#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>

#define	MAXLINE		4096	/* max text line length */
#define	LISTENQ		1024	/* 2nd argument to listen() */

void err_sys(const char *msg)
{
    printf("%s \n", msg);
    exit(1);
}

int Socket(int family, int type, int protocol)
{
    int n;
    if ( (n = socket(family, type, protocol)) < 0)
        err_sys("socket error");
    return n;
}

void Bind(int fd, const struct sockaddr *sa, socklen_t salen)
{
	if (bind(fd, sa, salen) < 0)
        err_sys("bind error");
}

void Listen(int fd, int backlog)
{
	char	*ptr;
		/*4can override 2nd argument with environment variable */
	if ( (ptr = getenv("LISTENQ")) != NULL)
		backlog = atoi(ptr);

	if (listen(fd, backlog) < 0)
        err_sys("listen error");
}

void Write(int fd, void *ptr, size_t nbytes)
{
	if (write(fd, ptr, nbytes) != nbytes)
		err_sys("write error");
}

void Close(int fd)
{
	if (close(fd) == -1)
		err_sys("close error");
}


int main()
{
    int listenfd, connfd;
    struct sockaddr_in servaddr;
    char buff[MAXLINE];
    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(13);  /* daytime server */

    Bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr));

    Listen(listenfd, LISTENQ);

    for( ; ; )
    {
        connfd = accept(listenfd, (struct sockaddr*) NULL, NULL);
        ticks = time(NULL);
        snprintf(buff ,sizeof(buff), "%.24s\r\n", ctime(&ticks));
        Write(connfd, buff, strlen(buff));

        Close(connfd);
        printf("time gived, connfd closed \n");
    }

    return 0;
}

运行效果:

UNIX网络编程:第1章 一个简单的时间获取客户程序+服务程序UNIX网络编程:第1章 一个简单的时间获取客户程序+服务程序