B"H make sure to close sockets when finished
This commit is contained in:
parent
a82df07c0c
commit
0317c48aac
38
net_io.c
38
net_io.c
|
@ -161,7 +161,14 @@ void modesFreeClient(struct client *c) {
|
|||
}
|
||||
}
|
||||
|
||||
// It's now safe to remove this client
|
||||
free(c);
|
||||
}
|
||||
//
|
||||
//=========================================================================
|
||||
//
|
||||
// Close the client connection and mark it as closed
|
||||
//
|
||||
void modesCloseClient(struct client *c) {
|
||||
close(c->fd);
|
||||
if (c->service == Modes.sbsos) {
|
||||
if (Modes.stat_sbs_connections) Modes.stat_sbs_connections--;
|
||||
|
@ -174,7 +181,7 @@ void modesFreeClient(struct client *c) {
|
|||
if (Modes.debug & MODES_DEBUG_NET)
|
||||
printf("Closing client %d\n", c->fd);
|
||||
|
||||
free(c);
|
||||
c->fd = -1;
|
||||
}
|
||||
//
|
||||
//=========================================================================
|
||||
|
@ -188,6 +195,7 @@ void modesSendAllClients(int service, void *msg, int len) {
|
|||
// Read next before servicing client incase the service routine deletes the client!
|
||||
struct client *next = c->next;
|
||||
|
||||
if (c->fd != -1) {
|
||||
if (c->service == service) {
|
||||
#ifndef _WIN32
|
||||
int nwritten = write(c->fd, msg, len);
|
||||
|
@ -195,9 +203,12 @@ void modesSendAllClients(int service, void *msg, int len) {
|
|||
int nwritten = send(c->fd, msg, len, 0 );
|
||||
#endif
|
||||
if (nwritten != len) {
|
||||
modesFreeClient(c);
|
||||
modesCloseClient(c);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
modesFreeClient(c);
|
||||
}
|
||||
c = next;
|
||||
}
|
||||
}
|
||||
|
@ -707,11 +718,12 @@ int handleHTTPRequest(struct client *c, char *p) {
|
|||
httpver = (strstr(p, "HTTP/1.1") != NULL) ? 11 : 10;
|
||||
if (httpver == 10) {
|
||||
// HTTP 1.0 defaults to close, unless otherwise specified.
|
||||
keepalive = strstr(p, "Connection: keep-alive") != NULL;
|
||||
//keepalive = strstr(p, "Connection: keep-alive") != NULL;
|
||||
} else if (httpver == 11) {
|
||||
// HTTP 1.1 defaults to keep-alive, unless close is specified.
|
||||
keepalive = strstr(p, "Connection: close") == NULL;
|
||||
//keepalive = strstr(p, "Connection: close") == NULL;
|
||||
}
|
||||
keepalive = 0;
|
||||
|
||||
// Identify he URL.
|
||||
p = strchr(p,' ');
|
||||
|
@ -775,7 +787,7 @@ int handleHTTPRequest(struct client *c, char *p) {
|
|||
|
||||
// Create the header and send the reply
|
||||
hdrlen = snprintf(hdr, sizeof(hdr),
|
||||
"HTTP/1.1 200 OK\r\n"
|
||||
"HTTP/1.0 200 OK\r\n"
|
||||
"Server: Dump1090\r\n"
|
||||
"Content-Type: %s\r\n"
|
||||
"Connection: %s\r\n"
|
||||
|
@ -845,6 +857,10 @@ void modesReadFromClient(struct client *c, char *sep,
|
|||
nread = recv(c->fd, c->buf+c->buflen, left, 0);
|
||||
if (nread < 0) {errno = WSAGetLastError();}
|
||||
#endif
|
||||
if (nread == 0) {
|
||||
modesCloseClient(c);
|
||||
return;
|
||||
}
|
||||
|
||||
// If we didn't get all the data we asked for, then return once we've processed what we did get.
|
||||
if (nread != left) {
|
||||
|
@ -855,7 +871,7 @@ void modesReadFromClient(struct client *c, char *sep,
|
|||
#else
|
||||
if ( (nread < 0) && (errno != EWOULDBLOCK)) { // Error, or end of file
|
||||
#endif
|
||||
modesFreeClient(c);
|
||||
modesCloseClient(c);
|
||||
}
|
||||
if (nread <= 0) {
|
||||
break; // Serve next client
|
||||
|
@ -902,7 +918,7 @@ void modesReadFromClient(struct client *c, char *sep,
|
|||
}
|
||||
// Have a 0x1a followed by 1, 2 or 3 - pass message less 0x1a to handler.
|
||||
if (handler(c, s)) {
|
||||
modesFreeClient(c);
|
||||
modesCloseClient(c);
|
||||
return;
|
||||
}
|
||||
fullmsg = 1;
|
||||
|
@ -918,7 +934,7 @@ void modesReadFromClient(struct client *c, char *sep,
|
|||
while ((e = strstr(s, sep)) != NULL) { // end of first message if found
|
||||
*e = '\0'; // The handler expects null terminated strings
|
||||
if (handler(c, s)) { // Pass message to handler.
|
||||
modesFreeClient(c); // Handler returns 1 on error to signal we .
|
||||
modesCloseClient(c); // Handler returns 1 on error to signal we .
|
||||
return; // should close the client connection
|
||||
}
|
||||
s = e + strlen(sep); // Move to start of next message
|
||||
|
@ -948,6 +964,7 @@ void modesReadFromClients(void) {
|
|||
// Read next before servicing client incase the service routine deletes the client!
|
||||
struct client *next = c->next;
|
||||
|
||||
if (c->fd >= 0) {
|
||||
if (c->service == Modes.ris) {
|
||||
modesReadFromClient(c,"\n",decodeHexMessage);
|
||||
} else if (c->service == Modes.bis) {
|
||||
|
@ -955,6 +972,9 @@ void modesReadFromClients(void) {
|
|||
} else if (c->service == Modes.https) {
|
||||
modesReadFromClient(c,"\r\n\r\n",handleHTTPRequest);
|
||||
}
|
||||
} else {
|
||||
modesFreeClient(c);
|
||||
}
|
||||
c = next;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue