Last active
December 19, 2015 17:39
-
-
Save annidy/5993306 to your computer and use it in GitHub Desktop.
Lua网络校时
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
#include <lua.h> | |
#include <lauxlib.h> | |
#include <lualib.h> | |
#include <time.h> | |
#include <Windows.h> | |
int load(lua_State* L, const char* func, unsigned int* utc) { | |
lua_getglobal(L, func); | |
if (lua_pcall(L, 0, 1, 0)) { | |
printf("Error Msg pcall %s.\n", lua_tostring(L, -1)); | |
return -1; | |
} | |
if (!lua_isnumber(L,-1)) { | |
printf("time should be a number\n" ); | |
return -2; | |
} | |
*utc = lua_tonumber(L,-1); | |
lua_pop(L, -1); | |
return 0; | |
} | |
void TimetToFileTime( time_t t, LPFILETIME pft ) | |
{ | |
LONGLONG ll = Int32x32To64(t, 10000000) + 116444736000000000; | |
pft->dwLowDateTime = (DWORD) ll; | |
pft->dwHighDateTime = ll >>32; | |
} | |
int main() | |
{ | |
lua_State* L = luaL_newstate(); | |
unsigned int utc = 0; | |
luaL_openlibs(L); | |
if (luaL_loadfile(L, "nettime.lua") || lua_pcall(L, 0, 0, 0)) { | |
printf("Error Msg load %s.\n", lua_tostring(L, -1)); | |
return -1; | |
} | |
do { | |
if(load(L,"nettime", &utc) == 0) { | |
time_t tt = utc - 2208988800L; | |
SYSTEMTIME st; | |
FILETIME ft; | |
TimetToFileTime(tt, &ft); | |
if (FileTimeToSystemTime(&ft, &st)) | |
{ | |
printf("Today is: %d-%d-%d\n", st.wYear, st.wMonth, st.wDay); | |
SetSystemTime(&st); | |
} | |
break; | |
} else { | |
puts("No network!"); | |
Sleep(10000); | |
} | |
} while (1); | |
lua_close(L); | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
----------------------------------------------------------------------------- | |
-- Network Time Protocal | |
-- Author: ani di | |
----------------------------------------------------------------------------- | |
package.cpath = package.cpath .. ';D:\\tools\\Lua\\5.1\\clibs\\?.dll;?.dll' | |
local socket = require "socket.core" | |
server_ip = { | |
-- "129.6.15.29", | |
"132.163.4.101", | |
"132.163.4.102", | |
"132.163.4.103", | |
"128.138.140.44", | |
"192.43.244.18", | |
"131.107.1.10", | |
"66.243.43.21", | |
"216.200.93.8", | |
"208.184.49.9", | |
"207.126.98.204", | |
"207.200.81.113", | |
"205.188.185.33"} | |
function nstol(str) | |
assert(str and #str == 4) | |
local t = {str:byte(1,-1)} | |
local n = 0 | |
for k = 1, #t do | |
n= n*256 + t[k] | |
end | |
return n | |
end | |
-- get time from a ip address, use tcp protocl | |
function gettime(ip) | |
print('connect ', ip) | |
local tcp = socket.tcp() | |
tcp:settimeout(10) | |
tcp:connect(ip, 37) | |
success, time = pcall(nstol, tcp:receive(4)) -- 32bit return | |
tcp:close() | |
return success and time or nil | |
end | |
function nettime() | |
for _, ip in pairs(server_ip) do | |
time = gettime(ip) | |
if time then | |
return time | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment