您的位置:首页 > 其它

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的。。我之前的博客有这两种方法的实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: