时间同步程序 命令行2.0版
1 //Server 2 #include <stdio.h> 3 #include <Winsock2.h> 4 #pragma comment(lib, "ws2_32.lib") 5 6 int main() 7 { 8 WORD wVersionRequested; 9 WSADATA wsaData; 10 int err; 11 12 wVersionRequested = MAKEWORD( 1, 1 ); 13 14 err = WSAStartup( wVersionRequested, &wsaData ); 15 if ( err != 0 ) 16 { 17 return 0; 18 } 19 20 if ( LOBYTE( wsaData.wVersion ) != 1 || 21 HIBYTE( wsaData.wVersion ) != 1 ) 22 { 23 WSACleanup( ); 24 return 0; 25 } 26 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); 27 28 SOCKADDR_IN addrSrv; 29 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 30 addrSrv.sin_family=AF_INET; 31 addrSrv.sin_port=htons(6000); 32 33 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口 34 35 listen(sockSrv,5); 36 37 SOCKADDR_IN addrClient;// 连接上的客户端ip地址 38 int len=sizeof(SOCKADDR); 39 while(1) 40 { 41 SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);// 接受客户端连接,获取客户端的ip地址 42 char sendBuf[50]; 43 sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));// 组合消息发送出去 44 send(sockConn,sendBuf,strlen(sendBuf)+1,0);// 发送消息到客户端 45 char recvBuf[50]; 46 recv(sockConn,recvBuf,50,0);// 接受客户端消息 47 printf("%s\n",recvBuf); 48 //closesocket(sockConn);//断开连接 49 } 50 51 return 0; 52 }
1 //Client 2 #include <stdio.h> 3 #include <Winsock2.h> 4 #pragma comment(lib, "ws2_32.lib") 5 6 int main() 7 { 8 WORD wVersionRequested; 9 WSADATA wsaData;//WSAata用来存储系统传回的关于WinSocket的资料。 10 int err; 11 12 wVersionRequested = MAKEWORD( 1, 1 ); 13 14 err = WSAStartup( wVersionRequested, &wsaData ); 15 if ( err != 0 ) 16 { 17 return 0; 18 } 19 20 if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 21 { 22 WSACleanup( ); 23 return 0; 24 } 25 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);// AF_INET ..tcp连接 26 //初始化连接与端口号 27 SOCKADDR_IN addrSrv; 28 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//本机地址,服务器在本机开启 29 addrSrv.sin_family=AF_INET; 30 addrSrv.sin_port=htons(6000);// 设置端口号 31 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//连接服务器 32 char recvBuf[50]; 33 recv(sockClient,recvBuf,50,0);//接受数据 34 printf("%s\n",recvBuf); 35 send(sockClient,"hello",strlen("hello")+1,0);//发送数据 36 closesocket(sockClient);//关闭连接 37 WSACleanup(); 38 39 getchar(); 40 41 return 0; 42 }
于是乎:
时间同步程序如下:
1 #include <stdio.h> 2 #include <Winsock2.h> 3 #include <windows.h> 4 #pragma comment(lib, "ws2_32.lib") 5 6 unsigned int getTime(void) 7 { 8 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);// AF_INET ..tcp连接 9 //初始化连接与端口号 10 SOCKADDR_IN addrSrv; 11 addrSrv.sin_addr.S_un.S_addr=inet_addr("132.163.4.103");//NTP地址 12 addrSrv.sin_family=AF_INET; 13 addrSrv.sin_port=htons(37);// 设置端口号 14 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//连接服务器 15 char recvBuf[50]; 16 unsigned int seconds = 0; 17 send(sockClient,(char*)&seconds,strlen("hello")+1,0);//发送数据 18 19 //recv(sockClient,(char*)&seconds,4,2);//接受数据 20 recv(sockClient,(char*)&seconds,4,0);//接受数据 21 seconds = ntohl(seconds); 22 if(0 == seconds) 23 { 24 return 0;//接收失败,返回0 25 } 26 printf("%u\n",seconds); 27 28 closesocket(sockClient);//关闭连接 29 return seconds; 30 } 31 32 void SetTime(unsigned long NTP_Time) 33 { 34 FILETIME ft; 35 SYSTEMTIME st; 36 st.wYear = 1900; 37 st.wMonth = 1; 38 st.wDay = 1; 39 st.wHour = 0; 40 st.wMinute = 0; 41 st.wSecond = 0; 42 st.wMilliseconds = 0; 43 SystemTimeToFileTime(&st, &ft); 44 LARGE_INTEGER li = *(LARGE_INTEGER*)&ft; 45 li.QuadPart += (LONGLONG)10000000 * NTP_Time; 46 ft = *(FILETIME*)&li; 47 FileTimeToSystemTime(&ft, &st); 48 SetSystemTime(&st); 49 } 50 int main() 51 { 52 WORD wVersionRequested; 53 WSADATA wsaData;//WSAata用来存储系统传回的关于WinSocket的资料。 54 int err; 55 56 wVersionRequested = MAKEWORD( 1, 1 ); 57 58 err = WSAStartup( wVersionRequested, &wsaData ); 59 if ( err != 0 ) 60 { 61 return 0; 62 } 63 64 if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 65 { 66 WSACleanup( ); 67 return 0; 68 } 69 70 unsigned int NTP_Time = 0; 71 while(1) 72 { 73 NTP_Time = getTime(); 74 if(0 != NTP_Time) 75 { 76 SetTime(NTP_Time); 77 } 78 Sleep(1000); 79 } 80 81 WSACleanup(); 82 83 getchar(); 84 85 return 0; 86 }