TCP获取时间网络程序,Server端:daytimetcpsrv.c
TCP获取时间网络程序,Clien端:daytimetcpcli.c
error.h
error.c
constant.h
安装xinetd,开启UDP时间服务,使用UDP协议获得时间的网络程序:daytimeudpcli.c
makefile文件:
#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