天天看點

網絡時間同步小程式

代碼參照網絡上的一些代碼,如需删除請告知

static int TimeGet()
{
  	struct sockaddr_in    from_addr; /*伺服器端位址*/
	struct sockaddr_in    server_addr; /*伺服器端位址*/
	int 	sock , ret , rec_len , server_len;
	char count = 0;
	unsigned long  m_serverTime[1024] = { 0 };
	unsigned char msg[48]={010,0,0,0,0,0,0,0,0};    // the packet we send
	fd_set readfds;
	unsigned long tmit;
	struct timeval timeout;
	timeout.tv_sec = 1;                    /*set the timeout to 10 seconds*/
	timeout.tv_usec = 0;
	time_t t = time(NULL);
	struct tm *tp = localtime(&t);
	// 中原標準時間  
	printf("%d/%d/%d\n", tp->tm_mon + 1, tp->tm_mday, tp->tm_year + 1900);
	printf("%d:%d:%d\n", tp->tm_hour, tp->tm_min, tp->tm_sec);
	sock =    socket(AF_INET, SOCK_DGRAM, 0);/*建立資料報套接字*/
	if( sock < 0 )
	{
		printf("---------HandleIPFound: socket init error\n");
		return -1;
	}
	server_len = sizeof(struct sockaddr_in);
	/*資料清零*/
	memset((void*)&from_addr, 0, sizeof(struct sockaddr_in));
	memset((void*)&server_addr, 0, sizeof(struct sockaddr_in));
    /*清空記憶體内容*/

	from_addr.sin_family = AF_INET; /*協定族*/

	from_addr.sin_addr.s_addr = inet_addr("200.20.186.76");/*本地位址*/

	from_addr.sin_port    = htons(123); /*偵聽端口*/


	printf("+++++++++++------------Connect: success\n\n\n");
	if((rec_len = sendto(sock,msg,sizeof(msg),0,(struct sockaddr *)&from_addr,sizeof(from_addr))) < 0)
	{
		perror("\n\n sendto error\n\n");  
		return -1;  
	}
	printf("+++++++++++------------sendto: success\n\n\n");	
	while(1)
	{
		sleep(1);
		FD_ZERO(&readfds);
		FD_SET(sock, &readfds);


		if ((ret = select(sock + 1, &readfds, NULL, NULL, &timeout)<= 0))
		{
			count ++ ;
			if(count >= 10)
				break;
			printf("time out ---------------\n");
			continue;
		}

		if (FD_ISSET(sock, &readfds))
		{
			if ((rec_len = recvfrom(sock, m_serverTime, 48, 0, (struct sockaddr *)&server_addr, &server_len)) < 0) {
				perror("\n\n recv error\n\n");
				continue;
				//		       return;  
			}
#if 0
			for (i = 0; i<13; i++) {
				printf("i =  %d m_serverTime: %d\n", i,m_serverTime[i]);
				tmit2 = ntohl((time_t)m_serverTime[i]);
				tmit2 -= 2208988800U;
				printf("i =  %d  %d Time: %s \n", i, tmit2, ctime(&tmit2));

			}
#endif
			tmit = ntohl((time_t)m_serverTime[10]);
			
			tmit -= 2208988800U;

			printf("Time: %s\n", ctime(&tmit));

			tp = localtime(&tmit);
			printf("%d/%d/%d\n", tp->tm_mon + 1, tp->tm_mday, tp->tm_year + 1900);
			printf("%d:%d:%d\n", tp->tm_hour, tp->tm_min, tp->tm_sec);

			

			return 0;
		}

	}
	return 0;
}
           

繼續閱讀