1.一个简单的服务器时间获取程序
服务器和客户端采用UDP通信的方式,来编写一个简单的时间获取应用.
把过程大致理顺一下,首先是服务器端的编写,使用的是迭代的方式,没有并发
先创建一个socket而后bind服务器,绑定之后就可以创建一个循环来接收和发送
信息了,以达到和客户端之间的通信.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #include <netinet/in.h> int main(int argc,char** argv) { printf("服务器开启中 "); /*创建套接字*/ int fd = socket(AF_INET,SOCK_DGRAM,0); if(-1 == fd) { perror("socket"); exit(-1); } /*准备通信地址*/ struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(2222); addr.sin_addr.s_addr = inet_addr("172.16.1.21"); /*防止端口被占用*/ int reuse = 1; setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)); /*绑定网络端口和ip地址*/ if(bind(fd,(struct sockaddr*)&addr,sizeof(addr)) == -1) { perror("bind"); exit(-1); } while(1) { /*发送和接收消息*/ char buf[100] = {}; struct sockaddr_in from; /*创建一个当前的时间*/ time_t now = time(0); struct tm* time = localtime(&now); socklen_t f_size = sizeof(from); recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&from,&f_size); printf("%s ",buf); memset(buf,0,sizeof(buf)); char str[50] = {}; sprintf(str,"%04d-%02d-%02d %02d:%02d:%02d",time->tm_year+1900, time->tm_mon+1,time->tm_mday,time->tm_hour, time->tm_min,time->tm_sec); strcpy(buf,str); sendto(fd,buf,sizeof(buf),0,(struct sockaddr*)&from,sizeof(from)); memset(buf,0,strlen(buf)); memset(str,0,strlen(str)); } }
客户端的编写,因为是UDP通信,并没有用到connect连接.而sendto和recvfrom函数可以保存发送和接收的套接字地址
所以客户端只要创建一个迭代循环,每次输入一个就可以得到服务器的时间.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> int main(void) { /*准备套接字*/ int fd = socket(AF_INET,SOCK_DGRAM,0); if(-1 == fd) { perror("socket"); exit(-1); } /*准备通信地址*/ struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(2222); addr.sin_addr.s_addr = inet_addr("172.16.1.21"); /*连接服务器的时候用sendto和UDP通信的时候可以不连接,直接发*/ while(1) { char buf[50] = {}; struct sockaddr_in from; socklen_t f_size = sizeof(from); scanf("%s",buf); if(-1 == sendto(fd,buf,strlen(buf),0,(struct sockaddr*)&addr,f_size)) { perror("sendto"); exit(-1); } memset(buf,0,strlen(buf)); if(-1 == recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&from,&f_size)) { perror("recvfrom"); exit(-1); } printf("%s ",buf); memset(buf,0,strlen(buf)); } close(fd); return 0; }