Lua 네트워크 시간 가 져 오기
Lua 네트워크 시간 가 져 오기
네트워크 시간 수여 서 비 스 는 일부 네트워크 의 시간 서버 가 제공 하 는 시간 으로 보통 로 컬 시계 동기 화 에 사용 된다.시간 을 주 는 서 비 스 는 여러 가지 가 있 는데, 일반적으로 우 리 는 RFC - 868 을 선택한다.이 프로 토 콜 의 작업 절 차 는: (S 대표 Server, C 대표 Client)
luasocket 사용 하기
실현 방안 은 여러 가지 가 있 는데 루 아가 반드시 가장 간단 한 것 은 아니 고 선택 은 개인의 흥미 에서 나 온 것 이다.코드 바로 올 려 주세요.
-----------------------------------------------------------------------------
-- 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))
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
코드 원 리 는 자세히 말 하지 않 고 매우 간단 하 다.유일 하 게 언급 할 만 한 것 은 socket 라 이브 러 리 에 포함 되 어 있 습 니 다.처음 쓰 는 이 말
require "socket"
해석 기 에 서 는 잘 표현 되 지만 C 에서 호출 하면 해당 모듈 을 찾 을 수 없습니다.오류 알림
no field package.preload['socket']
no file '.\socket.lua'
no file 'F:\Projects\Lua
ettime\lua\socket.lua'
no file 'F:\Projects\Lua
ettime\lua\socket\init.lua'
no file 'F:\Projects\Lua
ettime\socket.lua'
no file 'F:\Projects\Lua
ettime\socket\init.lua'
no file 'D:\tools\Lua\5.1\lua\socket.luac'
no file '.\socket.dll'
no file '.\socket51.dll'
no file 'F:\Projects\Lua
ettime\socket.dll'
no file 'F:\Projects\Lua
ettime\socket51.dll'
no file 'F:\Projects\Lua
ettime\clibs\socket.dll'
no file 'F:\Projects\Lua
ettime\clibs\socket51.dll'
no file 'F:\Projects\Lua
ettime\loadall.dll'
no file 'F:\Projects\Lua
ettime\clibs\loadall.dll'.
인터넷 에 도 비슷 한 질문 이 많 았 는데, 대체로 작가 의 가 이 드 를 자세히 보지 못 한 것 으로 나 타 났 다.눈 에 띄 게 이런 말 이 있어 요.
The other two environment variables instruct the compatibility module to look for dynamic libraries and extension modules in the appropriate directories and with the appropriate filename extensions.>
LUAPATH=/?.lua;?.lua LUACPATH=/?.dll;?.dll
"socket. core"에 대해 윈도 우즈 는 기본적으로 "\socket\\core. dll"에 설치 되 어 있 습 니 다.
C 숙주 호출
#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.
", lua_tostring(L, -1));
return -1;
}
if (!lua_isnumber(L,-1)) {
printf("time should be a number
" );
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.
", 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
", st.wYear, st.wMonth, st.wDay);
SetSystemTime(&st);
}
break;
} else {
puts("No network!");
Sleep(10000);
}
} while (1);
lua_close(L);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.