首页 > 代码库 > Linux网络编程(简单的时间获取服务器)
Linux网络编程(简单的时间获取服务器)
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("服务器开启中\n"); /*创建套接字*/ 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\n",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\n",buf); memset(buf,0,strlen(buf)); } close(fd); return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。