From 486dc5102ea07b6bbfc1c9eeb29a0d6b904bf1ca Mon Sep 17 00:00:00 2001 From: Chris Love Date: Fri, 3 Sep 2021 10:53:29 -0700 Subject: [PATCH] Winsock support --- example/example.cpp | 15 +++++++++++---- include/spdlog/details/udp_client-windows.h | 8 +++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/example/example.cpp b/example/example.cpp index 8ce5e69c..c580f796 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -5,6 +5,7 @@ // spdlog usage example #include +#include void load_levels_example(); void stdout_logger_example(); @@ -19,8 +20,8 @@ void multi_sink_example(); void user_defined_example(); void err_handler_example(); void syslog_example(); -void custom_flags_example(); void udp_example(); +void custom_flags_example(); #include "spdlog/spdlog.h" #include "spdlog/cfg/env.h" // support for loading levels from the environment variable @@ -75,8 +76,8 @@ int main(int, char *[]) err_handler_example(); trace_example(); stopwatch_example(); - custom_flags_example(); udp_example(); + custom_flags_example(); // Flush all *registered* loggers using a worker thread every 3 seconds. // note: registered loggers *must* be thread safe for this to work correctly! @@ -208,13 +209,19 @@ void stopwatch_example() spdlog::info("Stopwatch: {} seconds", sw); } +using namespace std::chrono_literals; void udp_example() { spdlog::sinks::udp_sink_config cfg("127.0.0.1", 11091); auto my_logger = spdlog::udp_logger_mt("udplog", cfg); my_logger->set_level(spdlog::level::debug); - my_logger->info("hello world"); - my_logger->info("are you ok"); + for (int i = 0; i < 10; i++) { + my_logger->info("hello world {}", i); +#ifndef _WIN32 + // sendto() on winsock will drop packets if sent too quickly + std::this_thread::sleep_for(40ms); +#endif + } } // A logger with multiple sinks (stdout and file) - each with a different format and log level. diff --git a/include/spdlog/details/udp_client-windows.h b/include/spdlog/details/udp_client-windows.h index 4ac37222..0eb8cb40 100644 --- a/include/spdlog/details/udp_client-windows.h +++ b/include/spdlog/details/udp_client-windows.h @@ -79,9 +79,10 @@ public: close(); } - addr_.sin_family = AF_INET; + addr_.sin_family = PF_INET; addr_.sin_port = htons(port); - InetPton(AF_INET, TEXT(host.c_str()), &addr_.sin_addr.s_addr); + addr_.sin_addr.s_addr = INADDR_ANY; + InetPton(PF_INET, TEXT(host.c_str()), &addr_.sin_addr.s_addr); socket_ = socket(PF_INET, SOCK_DGRAM, 0); if (socket_ == INVALID_SOCKET) @@ -113,7 +114,8 @@ public: void send(const char *data, size_t n_bytes) { - if ((sendto(socket_, data, static_cast(n_bytes), 0, (struct sockaddr *)&addr_, sizeof(struct sockaddr))) == -1) + socklen_t tolen = sizeof(struct sockaddr); + if (sendto(socket_, data, static_cast(n_bytes), 0, (struct sockaddr *)&addr_, tolen) == -1) { throw_spdlog_ex("sendto(2) failed", errno); close();