perror("sigaction");
}
#else
-#define is_running 1
-#define set_handler()
+static int is_running = 1;
+static SOCKET self_sock = INVALID_SOCKET;
+static BOOL WINAPI on_sigint(DWORD dwCtrlType)
+{
+ if ((dwCtrlType == CTRL_C_EVENT || dwCtrlType == CTRL_CLOSE_EVENT) && is_running) {
+ is_running = 0;
+ char x;
+ if (self_sock != INVALID_SOCKET) {
+ send(self_sock, &x, 0, 0); // FIXME: this could EAGAIN in theory
+ }
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+static void set_handler()
+{
+ SetConsoleCtrlHandler(on_sigint, TRUE);
+
+ self_sock = socket(AF_INET, SOCK_DGRAM, 0);
+ if (self_sock == INVALID_SOCKET) {
+ net_perror("ERROR CREATING SELF SOCK");
+ return;
+ }
+ struct sockaddr_in sin;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = htonl(0x7F000069);
+ int addrlen = sizeof(sin);
+ if (bind(self_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
+ goto err;
+ if (getsockname(self_sock, (struct sockaddr *)&sin, &addrlen) == -1)
+ goto err;
+ if (connect(self_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
+ goto err;
+ if (net_nonblock(self_sock) == -1)
+ goto err;
+ return;
+err:
+ net_perror("ERROR CREATING SELF SOCK");
+ closesocket(self_sock);
+ self_sock = INVALID_SOCKET;
+}
#endif
// Client linked list
#endif
int main() {
- set_handler();
int opt = 1;
SOCKET serverSocketV4 = 0;
SOCKET serverSocketV6 = 0;
fflush(stdout);
net_init();
+ set_handler();
databuf.buf = malloc(sizeof(char) * 512);
databuf.cap = 512;
#ifdef SUPPORT_IPV6
FD_SET(serverSocketV6, &readfds);
#endif
+#ifdef _WIN32
+ // we don't need to do highestFD for this on, cuz it's windows only
+ if (self_sock != INVALID_SOCKET)
+ FD_SET(self_sock, &readfds);
+#endif
+
// Set highestFD
if(serverSocketV4 < serverSocketV6) highestFD = serverSocketV6;
else highestFD = serverSocketV4;
#endif
net_perror("ERROR SELECT");
}
+#ifdef _WIN32
+ if (self_sock != INVALID_SOCKET && FD_ISSET(self_sock, &readfds)) {
+ char x;
+ while (recv(self_sock, &x, 0, 0) != -1)
+ ;
+ }
+#endif
// Accept new connections
// TODO: Optimize this with goto