a.述
书买很久了,好好学习下.O(∩_∩)O 只写程序,原理什么的,先不写了.
b.环境
deepin15.4.1 64位
vs code
gcc version 6.4.0 20170724 (Debian 6.4.0-2)
虚拟机里跑的 没在物理机安装
1.2一个简单的时间获取程序
/** * TCP_getDayTime.c * 安装时间服务 * sudo apt-get install xinetd -y * * 修改yes 为 no * sudo vi /etc/xinetd.d/daytime * * 重启服务 * /etc/init.d/xinetd restart * 服务是否正确 * sudo apt-get install netcat -y * nc 127.0.0.1 13 * * * 编译 gcc TCP_getDayTime.c -o TCP_getDayTime * 运行 ./TCP_getDayTime 127.0.0.1 * */ #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <errno.h> /*错误处理*/ void err_exit(char * err){ printf(" ---error at %s---- ",err); exit(errno); } int main(int argc, char ** argv) { int sockfd, n; char recvline[1024 + 1]; struct sockaddr_in servaddr; if (argc < 2) { err_exit("argc < 2"); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(13); if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) { err_exit("inet_pton()"); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0) ) <0) { err_exit("socket()"); } if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0) { err_exit("connect()"); } while ((n = read(sockfd, recvline, 1024)) > 0) { recvline[n]=0;/* 0=='0' */ if(fputs(recvline, stdout)==EOF){ err_exit("fputs()"); } if(n<0){ err_exit("n<0"); } } return 0; }
1.3协议无关性-ipv6版本
/** * TCP_getDayTimeipv6.c * 未测试 * ipv6版本 */ #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <errno.h> /*错误处理*/ void err_exit(char * err){ printf(" ---error at %s---- ",err); exit(errno); } int main(int argc, char ** argv) { int sockfd, n; char recvline[1024 + 1]; struct sockaddr_in6 servaddr;/**/ if (argc < 2) { err_exit("argc < 2"); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin6_family = AF_INET6;/**/ servaddr.sin6_port = htons(13);/**/ if (inet_pton(AF_INET6, argv[1], &servaddr.sin6_addr) <= 0) {/**/ err_exit("inet_pton()"); } if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0) ) <0) { err_exit("socket()"); } if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0) { err_exit("connect()"); } while ((n = read(sockfd, recvline, 1024)) > 0) { recvline[n]=0;/* 0=='0' */ if(fputs(recvline, stdout)==EOF){ err_exit("fputs()"); } if(n<0){ err_exit("n<0"); } } return 0; }
1.5一个简单的时间获取服务器程序
/** * * 注意端口不用使用1024以下的 * 1024以下要用root运行 才能成功监听吧? * */ #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <errno.h> #include <time.h> /*错误处理*/ void err_exit(char * err){ printf(" ---error at %s---- ",err); exit(errno); } int main(){ int listenfd,connfd; struct sockaddr_in servaddr; char buff[1024]; time_t ticks; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(5000); servaddr.sin_addr.s_addr=htonl(INADDR_ANY); if((listenfd=socket(AF_INET, SOCK_STREAM,0))<0){ err_exit("socket()"); } if((bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)))<0){ err_exit("bind()"); } if(listen(listenfd, 5) <0){ err_exit("listen()"); } for(; ;) { if((connfd=accept(listenfd, (struct sockaddr *)NULL, NULL))<0){ err_exit("accept()"); } ticks=time(NULL); snprintf(buff, sizeof(buff), "%.24s ", ctime(&ticks)); write(connfd, buff, strlen(buff)); close(connfd); } }