socket实现获取服务器时间
2016-04-02 13:35
375 查看
上次初步实现了一下socket的应用程序。。这次在针对socket写一个应用程序。。
这次的应用是实现客户端从主机获取时间并且设置为自己的时间
服务器代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include <sys/time.h>
#include<time.h>
#define MAXLINE 4096
int main(int argc, char** argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[4096];
int n;
time_t timep;
struct tm *p;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create socket error:%s(errno:%d)\n", strerror(errno),errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6666);
if((bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) == -1)
{
printf("bind error:%s(errno:%d)\n", strerror(errno), errno);
exit(0);
}
if (listen(listenfd, 10) == -1)
{
printf("listen socket error:%s(errno:%d)\n", strerror(errno), errno);
exit(0);
}
printf("=================waiting for client's request=====================\n");
while(1)
{
if((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
{
printf("accept error:%s(errno:%d)\n", strerror(errno), errno);
continue;
}
n = recv(connfd, buff, MAXLINE, 0);
buff
= '\0';
printf("the address's request is %s\n", buff);
time(&timep); //获取时间并打印显示当前时间。。可以不打印
p=localtime(&timep);
printf ("%d/%d/%d %d:%d:%d\n", ( 1+p->tm_mon), p->tm_mday,(1900+p->tm_year), p->tm_hour, p->tm_min, p->tm_sec);
buff[0] = (char) p->tm_year; //处理字符串方便客户端接受
buff[1] = '-';
buff[2] = (char) p->tm_mon;
buff[3] = '-';
buff[4] = (char) p->tm_mday;
buff[5] = '-';
buff[6] = (char) p->tm_hour;
buff[7] = '-';
buff[8] = (char) p->tm_min;
buff[9] = '-';
buff[10] = (char) p->tm_sec;
buff[11] = '\0';
if(send(connfd, buff, strlen(buff), 0) <0 )
//发送字符串
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
close(connfd);
}
close(listenfd);
}
客户端代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <sys/time.h>
#include<time.h>
#define MAXLINE 4096
int settime(char *recvline) //设置时间的函数
{
char year, mon, day, hour, min, sec;
struct tm tm;
time_t timep;
struct timeval tv;
sscanf(recvline,"%c-%c-%c-%c-%c-%c",&year, &mon, &day, &hour, &min, &sec);
//从传过来的字符串中提取出想要的信息
tm.tm_year = (int) year;
tm.tm_mon = (int) mon;
tm.tm_mday = (int) day;
tm.tm_hour = (int) hour;
tm.tm_min = (int) min;
tm.tm_sec = (int) sec;
timep = mktime(&tm);
tv.tv_sec = timep;
tv.tv_usec = 0;
if(settimeofday (&tv, (struct timezone *) 0) < 0)
//设置时间
{
printf("Set system datatime error!\n");
return -1;
}
return 0;
}
int main(int argc, char **argv)
{
int sockfd, n;
char recvline[4096];
char sendline[4096] = "get time";
struct sockaddr_in servaddr;
if (argc != 2)
{
printf("usage: ./client<ipaddress>\n");
exit(0);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(6666);
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
{
printf("inet_pton error for %s\n",argv[1]);
exit(0);
}
if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) <0 )
{
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
if (send(sockfd, sendline, strlen(sendline), 0) <0 )
//向服务器说明动作。。没具体用途
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
n = recv(sockfd, recvline, MAXLINE, 0);
//接受字符串
recvline
= '\0';
if((n=settime(recvline)) < 0)
{
printf("settime error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
close(sockfd);
return 0;
}
这样就可以实现获取时间了。。
我用的是开发板当客户端。。在这之前无比实现gprs模块ppp拨号上网或者wifi上网功能或者其他上网功能。。要不开发板ping不通主机是没办法实现socket的。。我之前的博客有这两种方法的实现
这次的应用是实现客户端从主机获取时间并且设置为自己的时间
服务器代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include <sys/time.h>
#include<time.h>
#define MAXLINE 4096
int main(int argc, char** argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[4096];
int n;
time_t timep;
struct tm *p;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create socket error:%s(errno:%d)\n", strerror(errno),errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6666);
if((bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) == -1)
{
printf("bind error:%s(errno:%d)\n", strerror(errno), errno);
exit(0);
}
if (listen(listenfd, 10) == -1)
{
printf("listen socket error:%s(errno:%d)\n", strerror(errno), errno);
exit(0);
}
printf("=================waiting for client's request=====================\n");
while(1)
{
if((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
{
printf("accept error:%s(errno:%d)\n", strerror(errno), errno);
continue;
}
n = recv(connfd, buff, MAXLINE, 0);
buff
= '\0';
printf("the address's request is %s\n", buff);
time(&timep); //获取时间并打印显示当前时间。。可以不打印
p=localtime(&timep);
printf ("%d/%d/%d %d:%d:%d\n", ( 1+p->tm_mon), p->tm_mday,(1900+p->tm_year), p->tm_hour, p->tm_min, p->tm_sec);
buff[0] = (char) p->tm_year; //处理字符串方便客户端接受
buff[1] = '-';
buff[2] = (char) p->tm_mon;
buff[3] = '-';
buff[4] = (char) p->tm_mday;
buff[5] = '-';
buff[6] = (char) p->tm_hour;
buff[7] = '-';
buff[8] = (char) p->tm_min;
buff[9] = '-';
buff[10] = (char) p->tm_sec;
buff[11] = '\0';
if(send(connfd, buff, strlen(buff), 0) <0 )
//发送字符串
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
close(connfd);
}
close(listenfd);
}
客户端代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <sys/time.h>
#include<time.h>
#define MAXLINE 4096
int settime(char *recvline) //设置时间的函数
{
char year, mon, day, hour, min, sec;
struct tm tm;
time_t timep;
struct timeval tv;
sscanf(recvline,"%c-%c-%c-%c-%c-%c",&year, &mon, &day, &hour, &min, &sec);
//从传过来的字符串中提取出想要的信息
tm.tm_year = (int) year;
tm.tm_mon = (int) mon;
tm.tm_mday = (int) day;
tm.tm_hour = (int) hour;
tm.tm_min = (int) min;
tm.tm_sec = (int) sec;
timep = mktime(&tm);
tv.tv_sec = timep;
tv.tv_usec = 0;
if(settimeofday (&tv, (struct timezone *) 0) < 0)
//设置时间
{
printf("Set system datatime error!\n");
return -1;
}
return 0;
}
int main(int argc, char **argv)
{
int sockfd, n;
char recvline[4096];
char sendline[4096] = "get time";
struct sockaddr_in servaddr;
if (argc != 2)
{
printf("usage: ./client<ipaddress>\n");
exit(0);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(6666);
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
{
printf("inet_pton error for %s\n",argv[1]);
exit(0);
}
if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) <0 )
{
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
if (send(sockfd, sendline, strlen(sendline), 0) <0 )
//向服务器说明动作。。没具体用途
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
n = recv(sockfd, recvline, MAXLINE, 0);
//接受字符串
recvline
= '\0';
if((n=settime(recvline)) < 0)
{
printf("settime error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
close(sockfd);
return 0;
}
这样就可以实现获取时间了。。
我用的是开发板当客户端。。在这之前无比实现gprs模块ppp拨号上网或者wifi上网功能或者其他上网功能。。要不开发板ping不通主机是没办法实现socket的。。我之前的博客有这两种方法的实现
相关文章推荐
- UML类图几种关系的总结
- POJ 3268 Silver Cow Party 正反单源最短路
- 哪些网站适合用于充电、学习新知识
- Android仿淘宝订单页面实现
- 第五周进度条
- HDU 2013 蟠桃记
- 字节排序函数
- DFS-部分和问题
- echo命令解析
- Android HTTP请求方式:HttpClient
- 【Qt】Qstring
- 深入理解Objective-C:Category(上)
- 数据结构实验之排序三:bucket sort
- MFC-通过WtsApi32.dll中的函数枚举进程
- MNIST数据集规则化
- 逻辑数据库设计 - 单纯的树(递归关系数据)
- Android studio下载依赖时提示连接超时time out的解决方法
- while循环
- Delphi 高效读写锁
- Android-->MediaMuxer,MediaCodec,AudioRecord及Camera实现音频视频混合MP4文件