Lua 네트워크 시간 가 져 오기

5124 단어
저자: anidi  판권 소유, 전재 반드시 이 링크 유지 http://blog.csdn.net/ani_di
Lua 네트워크 시간 가 져 오기
네트워크 시간 수여 서 비 스 는 일부 네트워크 의 시간 서버 가 제공 하 는 시간 으로 보통 로 컬 시계 동기 화 에 사용 된다.시간 을 주 는 서 비 스 는 여러 가지 가 있 는데, 일반적으로 우 리 는 RFC - 868 을 선택한다.이 프로 토 콜 의 작업 절 차 는: (S 대표 Server, C 대표 Client)
  • S: 검 측 포트 37
  • U: 포트 37
  • 에 연결
  • S: 32 비트 이 진수 로 발송 시간
  • U: 수신 시간
  • U: 연결 닫 기
  • S: 연결 닫 기
  • 프로 토 콜 은 매우 간단 합 니 다. TCP 로 연결 한 후 서버 는 직접 시간 을 보 냅 니 다.1900 년 1 월 1 일 자정 부터 지금까지 의 초 수 를 보 냈 다.
    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; }

    좋은 웹페이지 즐겨찾기