Unix网络编程实例:获取时间网络程序

TCP获取时间网络程序,Server端:daytimetcpsrv.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include "error.h"

#define MAXLINE 4096
#define LISTENQ 1024

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

    listenfd = socket(AF_INET,SOCK_STREAM,0);
    if (listenfd < 0)
        err_sys("socket error");

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(13);

    if (bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
        err_sys("bind error");

    if ((listen(listenfd,LISTENQ)) < 0)
        err_sys("listen error");

    for (;;)
    {
        if ((connfd = accept(listenfd,(struct sockaddr *)NULL,NULL)) < 0)
            err_sys("accept error");
        ticks = time(NULL);
        snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
        if ((write(connfd,buff,strlen(buff))) != strlen(buff))
            err_sys("write error");
        if (close(connfd) == -1)
            err_sys("close error");
    }
    exit(0);
}

TCP获取时间网络程序,Clien端:daytimetcpcli.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

#define MAXLINE 4096
int main(int argc, char **argv)
{
    int sockfd, n;
    char recvline[MAXLINE + 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(13);    /* daytime server */
    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
        err_quit("inet_pton error for %s", argv[1]);

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

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

    exit(0);
}

error.h
#ifndef ERROR_H
#define ERROR_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <syslog.h>
#include <errno.h>
#include "constant.h"

static void err_doit(int, int, const char *, va_list);

void err_ret(const char *fmt, ...);
void err_sys(const char *fmt, ...);
void err_dump(const char *fmt, ...);
void err_msg(const char *fmt, ...);
void err_quit(const char *fmt, ...);

#endif

error.c
#include "error.h"

int daemon_proc;        /* set nonzero by daemon_init() */

static void err_doit(int, int, const char *, va_list);

/* Nonfatal error related to system call
 * Print message and return */

void err_ret(const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    err_doit(1, LOG_INFO, fmt, ap);
    va_end(ap);
    return;
}

/* Fatal error related to system call
 * Print message and terminate */

void err_sys(const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    err_doit(1, LOG_ERR, fmt, ap);
    va_end(ap);
    exit(1);
}

/* Fatal error related to system call
 * Print message, dump core, and terminate */

void err_dump(const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    err_doit(1, LOG_ERR, fmt, ap);
    va_end(ap);
    abort();        /* dump core and terminate */
    exit(1);        /* shouldn't get here */
}
/* Fatal error unrelated to system call
 * Print message and terminate */

void err_quit(const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    err_doit(0, LOG_ERR, fmt, ap);
    va_end(ap);
    exit(1);
}

/* Print message and return to caller
 * Caller specifies "errnoflag" and "level" */

static void err_doit(int errnoflag, int level, const char *fmt, va_list ap)
{
    int errno_save, n;
    char buf[MAXLINE + 1];

    errno_save = errno;        /* value caller might want printed */
#ifdef HAVE_VSNPRINTF
    vsnprintf(buf, MAXLINE, fmt, ap);    /* safe */
#else
    vsprintf(buf, fmt, ap);                    /* not safe */
#endif
    n = strlen(buf);
    if (errnoflag)
        snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));
    strcat(buf, "\n");

    if (daemon_proc) {
        syslog(level, buf);
    } else {
        fflush(stdout);        /* in case stdout and stderr are the same */
        fputs(buf, stderr);
        fflush(stderr);
    }
    return;
}

constant.h
#ifndef Constant_H
#define Constant_H

#ifndef MAXLINE
#define MAXLINE 4096
#endif

#ifndef LISTENQ
#define LISTENQ 1024
#endif

#ifndef BUFFSIZE
#define BUFFSIZE 8092
#endif

#endif

安装xinetd,开启UDP时间服务,使用UDP协议获得时间的网络程序:daytimeudpcli.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include "error.h"
#include "constant.h"

int main(int argc,char *argv[])
{
    char *host;
    struct hostent *hostinfo;
    struct servent *servinfo;
    struct in_addr **pptr;

    if (argc != 2)
        host = "localhost";
    else
        host = argv[1];
    if ((hostinfo = gethostbyname(host)) == NULL)
        err_sys("gethostbyname error");
    if ((servinfo = getservbyname("daytime","udp")) == NULL)
        err_sys("getservbyname error");
    pptr = (struct in_addr **)hostinfo->h_addr_list;

    int sockfd,n;
    struct sockaddr_in addr;
    char buff[BUFFSIZE];

    if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0)
        err_sys("socket error");

    bzero((char *)&addr,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(13);
    addr.sin_addr = **(struct in_addr **)hostinfo->h_addr_list;

    if (sendto(sockfd,buff,sizeof(buff),0,(struct sockaddr *)&addr,sizeof(addr)) != sizeof(buff))
        err_sys("sendto error");
    if (( n = recvfrom(sockfd,buff,sizeof(buff),0,NULL,NULL)) < 2)
        err_sys("recvfrom error");
    buff[n-2] = 0;
    printf("%s\n",buff);

    exit(0);
}

makefile文件:
#TCP时间获取服务器程序和客户端程序
#UDP时间获取客户端程序
bins=daytimetcpsrv daytimetcpcli daytimeudpcli
objs=daytimetcpsrv.o daytimetcpcli.o error.o daytimeudpcli.o
srcs=daytimetcpsrv.c daytimetcpcli.c error.c error.h daytimeudpcli.c
$(bins):$(objs)
        gcc -o daytimetcpsrv daytimetcpsrv.o error.o
        gcc -o daytimetcpcli daytimetcpcli.o error.o
        gcc -o daytimeudpcli daytimeudpcli.o error.o
$(objs):$(srcs)
        gcc -c daytimetcpsrv.c
        gcc -c daytimetcpcli.c
        gcc -c error.c error.h
        gcc -c daytimeudpcli.c
clean:
        rm -f $(bins) *.o *.h.gch













评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值