From a2f209d2f21282d8ddb6ab76d9b6bd8f5f23b37c Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Sat, 6 Jun 2015 01:28:02 +0200 Subject: Make sender sockets non-blocking --- src/sender.cc | 22 ++++++++++++++++++++++ src/sender_client.cc | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/sender.cc b/src/sender.cc index e9b4a94..d43042e 100644 --- a/src/sender.cc +++ b/src/sender.cc @@ -222,6 +222,21 @@ void queue_message(const std::string& channel, const std::string& message) { g_info.requests.emplace_back(g_info.multi, g_info.url, obj->str()); } +bool make_nonblock(int sock) { + int flags = fcntl(sock, F_GETFL, 0); + if (flags < 0) { + return false; + } + if (!(flags & O_NONBLOCK)) { + flags |= O_NONBLOCK; + if (fcntl(sock, F_SETFL, flags) < 0) { + return false; + } + } + return true; +} + + } // namespace int main() { @@ -311,9 +326,15 @@ int main() { goto error; } + make_nonblock(sock_); + { int value = 1; +#ifdef SO_REUSEPORT setsockopt(sock_, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(value)); +#else + setsockopt(sock_, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value)); +#endif } signal(SIGPIPE, SIG_IGN); @@ -392,6 +413,7 @@ int main() { std::cerr << "Accept failed: " << strerror(errno); goto error; } + make_nonblock(sock); if (clients.size() == MAX_CLIENTS) { // Remove oldest clients.erase(clients.begin()); diff --git a/src/sender_client.cc b/src/sender_client.cc index f954a5c..9b89ed5 100644 --- a/src/sender_client.cc +++ b/src/sender_client.cc @@ -32,7 +32,7 @@ public: if (!config) return false; sender_ = config->get("sender", ""); if (sender_.empty()) return false; - return setup(); + return true; } void send(const std::string& channel, const std::string& message) override { -- cgit v1.2.3-70-g09d2