您的位置:首页 > 理论基础 > 计算机网络

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

2011-08-17 01:34 816 查看
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
= 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: