2013-04-21 67 views
2

我通过引用here上的网页在底部使用代码ntp客户端代码。代码接收时间信息,然后我想将时间信息存储为YYYYMMDDHHMM,如201304211405。代码接收来自NTP服务器的时间信息,但是我很难找到如何将该信息传递给strftime,我应该如何将接收到的时间信息传递给strftime从NTP服务器向strftime函数传递时间信息

下面是代码

i=recv(s,buf,sizeof(buf),0); 

tmit=ntohl((time_t)buf[10]); //# get transmit time 
tmit-= 2208988800U; 
printf("tmit=%d\n",tmit); 

//#compare to system time 
printf("Time is time: %s",ctime(&tmit)); 
char buffer[13]; 
struct tm * timeinfo; 
timeinfo = ctime(&tmit); 

strftime (buffer,13,"%04Y%02m%02d%02k%02M",timeinfo); 
printf("new buffer:%s\n" ,buffer); 

这里的相关部分,我使用

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 

void ntpdate(); 

int main() { 
    ntpdate(); 
    return 0; 
} 

void ntpdate() { 
char *hostname="79.99.6.190 2"; 
int portno=123;  //NTP is port 123 
int maxlen=1024;  //check our buffers 
int i;   // misc var i 
unsigned char msg[48]={010,0,0,0,0,0,0,0,0}; // the packet we send 
unsigned long buf[maxlen]; // the buffer we get back 
//struct in_addr ipaddr;  // 
struct protoent *proto;  // 
struct sockaddr_in server_addr; 
int s; // socket 
int tmit; // the time -- This is a time_t sort of 

//use Socket; 
proto=getprotobyname("udp"); 
s=socket(PF_INET, SOCK_DGRAM, proto->p_proto); 

memset(&server_addr, 0, sizeof(server_addr)); 
server_addr.sin_family=AF_INET; 
server_addr.sin_addr.s_addr = inet_addr(hostname); 
server_addr.sin_port=htons(portno); 
// send the data 
i=sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&server_addr,sizeof(server_addr)); 


/***************HERE WE START**************/ 
// get the data back 
i=recv(s,buf,sizeof(buf),0); 

tmit=ntohl((time_t)buf[10]); //# get transmit time 
tmit-= 2208988800U; 
printf("tmit=%d\n",tmit); 

//#compare to system time 
printf("Time is time: %s",ctime(&tmit)); 
char buffer[13]; 
struct tm * timeinfo; 
timeinfo = ctime(&tmit); 

strftime (buffer,13,"%04Y%02m%02d%02k%02M",timeinfo); 
printf("new buffer:%s\n" ,buffer); 
} 
+0

是您的代码工作的替换线? – mohit 2013-04-21 18:30:06

+0

它正在工作,但'strftime'是错误的,将错误的数据传递到'char缓冲区[13]' – sven 2013-04-21 18:33:36

回答

1

的问题是与线的完整代码...

timeinfo = ctime(&tmit); 

如果timeinfostruct tm *类型,则不能将其指向char *人类可读的字符串由ctime()返回。

如果你转换为struct tm *,你需要为使用gmtime()localtime(),这取决于你是否希望struct tm *是UTC时间,或表示相对于本地时区。

由于ctime()使用本地时区,我会认为你想这样,所以用...

timeinfo = localtime(&tmit); 
+0

'localtime'和'gmtime'从本地系统获取时间?我想将时间信息传递给从'tmit'存储的NTP服务器获取的'buffer'。我的问题是如何做到这一点 – sven 2013-04-21 18:55:04

+0

@sven查看更新的答案。 – Aya 2013-04-21 18:58:23

+0

谢谢Aya的帮助! – sven 2013-04-21 19:12:14

相关问题