Skip to content

Commit 237620e

Browse files
committed
Fix #91
Use alarm signal to interrupt blocking calls (such as accept).
1 parent 5fd063b commit 237620e

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/Utils/sockets.cpp

+12-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <sys/socket.h>
66
#include <unistd.h>
77

8+
#include <csignal>
89
#include <cstdarg>
910
#include <cstdio>
1011
#include <cstdlib>
@@ -85,8 +86,7 @@ int Sink::write(const char *fmt, ...) const {
8586
return written;
8687
}
8788

88-
Duplex::Duplex(FILE *inStream, FILE *outStream)
89-
: Sink(outStream) {
89+
Duplex::Duplex(FILE *inStream, FILE *outStream) : Sink(outStream) {
9090
this->inDescriptor = fileno(inStream);
9191
}
9292

@@ -146,7 +146,15 @@ ssize_t WebSocket::read(void *out, size_t size) {
146146
return ::read(this->socket, out, size);
147147
}
148148

149+
void sendAlarm() {
150+
struct sigaction sact {};
151+
sigemptyset(&sact.sa_mask);
152+
sact.sa_flags = 0;
153+
sigaction(SIGALRM, &sact, nullptr);
154+
alarm(0);
155+
}
156+
149157
void WebSocket::close() {
150-
// TODO stop listenForIncomingConnection
151-
shutdown(this->fileDescriptor, SHUT_RDWR);
158+
sendAlarm(); // stop possible blocking accept call
159+
shutdown(this->fileDescriptor, SHUT_RDWR); // shutdown connection
152160
}

0 commit comments

Comments
 (0)