Unix网络编程实例:获取时间网络程序
2011-08-17 01:34
816 查看
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 = 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
相关文章推荐
- Android编程获取网络时间实例分析
- [Linux网络编程]应用实例--获取网络时间
- Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间
- unix网络基础-TCP时间获取客户程序
- Unix/Linux环境C编程入门教程(22) C/C++如何获取程序的运行时间
- Unix/Linux环境C编程入门教程(22) C/C++如何获取程序的运行时间
- UNIX网络编程卷1 时间获取程序服务器 TCP 协议相关性
- Android编程获取网络时间实例分析
- Linux编程之《只运行一个实例》以及动态获取当前程序名称
- 网络编程-TCP程序实例(简单上传图片)
- unix网络基础-显示客户IP地址和端口号的时间获取服务器程序
- Qt: 网络编程实例,QNetworkAccessManager获取网页数据
- 编程中获取Unix时间戳
- UNIX-LINUX编程实践教程->第八章->实例代码注解->写一个简单的shell->在shell中启动另一个程序
- unix网络基础-TCP时间获取服务器程序
- 网络编程 CAsyncSocket类的应用实例 聊天程序 客户端代码
- java 网络编程【6】 用UDP编写网络聊天程序 以及 TCP编程实例
- 网络编程-TCP程序实例(只是发送了数据,在服务器显示)
- Android网络编程之获取网络上的Json数据实例
- 【Unix 网络编程】TCP 客户/服务器简单 Socket 程序