adding ntp support to fc
This commit is contained in:
parent
51de9e6abf
commit
0c64d208d9
6 changed files with 84 additions and 0 deletions
|
|
@ -148,6 +148,7 @@ set( fc_sources
|
|||
src/network/udp_socket.cpp
|
||||
src/network/http/http_connection.cpp
|
||||
src/network/http/http_server.cpp
|
||||
src/network/ntp.cpp
|
||||
src/network/ip.cpp
|
||||
src/network/rate_limiting.cpp
|
||||
src/network/resolve.cpp
|
||||
|
|
@ -214,6 +215,9 @@ target_include_directories(fc
|
|||
|
||||
target_link_libraries( fc PUBLIC easylzma_static ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARIES} ${CMAKE_DL_LIBS})
|
||||
|
||||
add_executable( ntp_test ntp_test.cpp )
|
||||
target_link_libraries( ntp_test fc )
|
||||
|
||||
#add_executable( test_compress tests/compress.cpp )
|
||||
#target_link_libraries( test_compress fc )
|
||||
#add_executable( test_aes tests/aes_test.cpp )
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
#pragma once
|
||||
#include <fc/string.hpp>
|
||||
#include <fc/utility.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace fc {
|
||||
uint8_t from_hex( char c );
|
||||
fc::string to_hex( const char* d, uint32_t s );
|
||||
std::string to_hex( const std::vector<char>& data );
|
||||
|
||||
/**
|
||||
* @return the number of bytes decoded
|
||||
|
|
|
|||
15
include/fc/network/ntp.hpp
Normal file
15
include/fc/network/ntp.hpp
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#pragma once
|
||||
#include <string>
|
||||
#include <fc/time.hpp>
|
||||
|
||||
|
||||
namespace fc {
|
||||
|
||||
class ntp
|
||||
{
|
||||
public:
|
||||
static void set_server( const std::string& hostname, uint16_t port = 123 );
|
||||
static fc::time_point get_time();
|
||||
};
|
||||
|
||||
} // namespace fc
|
||||
15
ntp_test.cpp
Normal file
15
ntp_test.cpp
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#include <fc/network/ntp.hpp>
|
||||
#include <fc/log/logger.hpp>
|
||||
|
||||
int main( int argc, char** argv )
|
||||
{
|
||||
fc::time_point ntp_time = fc::ntp::get_time();
|
||||
auto delta = ntp_time - fc::time_point::now();
|
||||
auto minutes = delta.count() / 1000000 / 60;
|
||||
auto hours = delta.count() / 1000000 / 60 / 60;
|
||||
auto seconds = delta.count() / 1000000;
|
||||
auto msec= delta.count() / 1000;
|
||||
|
||||
idump( (ntp_time)(delta)(msec)(seconds)(minutes)(hours) );
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -39,5 +39,11 @@ namespace fc {
|
|||
}
|
||||
return out_pos - (uint8_t*)out_data;
|
||||
}
|
||||
std::string to_hex( const std::vector<char>& data )
|
||||
{
|
||||
if( data.size() )
|
||||
return to_hex( data.data(), data.size() );
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
42
src/network/ntp.cpp
Normal file
42
src/network/ntp.cpp
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
#include <fc/network/ntp.hpp>
|
||||
#include <fc/network/udp_socket.hpp>
|
||||
#include <fc/network/resolve.hpp>
|
||||
#include <fc/network/ip.hpp>
|
||||
|
||||
#include <array>
|
||||
|
||||
namespace fc
|
||||
{
|
||||
static fc::ip::endpoint ntp_server;
|
||||
|
||||
|
||||
void ntp::set_server( const std::string& hostname, uint16_t port )
|
||||
{
|
||||
auto eps = resolve( hostname, port );
|
||||
if( eps.size() )
|
||||
ntp_server = eps.front();
|
||||
}
|
||||
|
||||
fc::time_point ntp::get_time()
|
||||
{
|
||||
static bool init_ntp_server = [](){
|
||||
set_server( "pool.ntp.org", 123 );
|
||||
return true;
|
||||
}();
|
||||
(void)init_ntp_server;
|
||||
|
||||
udp_socket sock;
|
||||
sock.open();
|
||||
|
||||
std::array<unsigned char, 48> send_buf { {010,0,0,0,0,0,0,0,0} };
|
||||
|
||||
sock.send_to( (const char*)send_buf.data(), send_buf.size(), ntp_server );
|
||||
|
||||
fc::ip::endpoint from;
|
||||
std::array<unsigned long, 1024> recv_buf;
|
||||
sock.receive_from( (char*)recv_buf.data(), recv_buf.size(), from );
|
||||
|
||||
return fc::time_point() + fc::seconds( ntohl((time_t)recv_buf[4]) - 2208988800U);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in a new issue