diff options
| author | Joel Klinghed <the_jk@yahoo.com> | 2015-06-06 01:28:02 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@yahoo.com> | 2015-06-06 01:29:13 +0200 |
| commit | a2f209d2f21282d8ddb6ab76d9b6bd8f5f23b37c (patch) | |
| tree | 73980d1e50fab1f5e49c4755ac6a28067abfb8c9 /src/sender.cc | |
| parent | a7bb0f26b3434b7064b01aefd56d8600cc466bd1 (diff) | |
Make sender sockets non-blocking
Diffstat (limited to 'src/sender.cc')
| -rw-r--r-- | src/sender.cc | 22 |
1 files changed, 22 insertions, 0 deletions
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()); |
