httpd: add config option to limit number of clients
This commit is contained in:
parent
bde3d14339
commit
bb5acc939f
@ -252,6 +252,7 @@ input {
|
|||||||
## quality "5.0" # do not define if bitrate is defined
|
## quality "5.0" # do not define if bitrate is defined
|
||||||
# bitrate "128" # do not define if quality is defined
|
# bitrate "128" # do not define if quality is defined
|
||||||
# format "44100:16:1"
|
# format "44100:16:1"
|
||||||
|
# max_clients "0" # optional 0=no limit
|
||||||
#}
|
#}
|
||||||
#
|
#
|
||||||
# An example of a pulseaudio output (streaming to a remote pulseaudio server)
|
# An example of a pulseaudio output (streaming to a remote pulseaudio server)
|
||||||
|
10
doc/user.xml
10
doc/user.xml
@ -803,6 +803,16 @@ cd mpd-version</programlisting>
|
|||||||
second.
|
second.
|
||||||
</entry>
|
</entry>
|
||||||
</row>
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>
|
||||||
|
<varname>max_clients</varname>
|
||||||
|
<parameter>MC</parameter>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
Sets a limit, number of concurrent clients. When set
|
||||||
|
to 0 no limit will apply.
|
||||||
|
</entry>
|
||||||
|
</row>
|
||||||
</tbody>
|
</tbody>
|
||||||
</tgroup>
|
</tgroup>
|
||||||
</informaltable>
|
</informaltable>
|
||||||
|
@ -97,6 +97,12 @@ struct httpd_output {
|
|||||||
* function.
|
* function.
|
||||||
*/
|
*/
|
||||||
char buffer[32768];
|
char buffer[32768];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum and current number of clients connected
|
||||||
|
* at the same time.
|
||||||
|
*/
|
||||||
|
guint clients_max, clients_cnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -76,6 +76,8 @@ httpd_output_init(G_GNUC_UNUSED const struct audio_format *audio_format,
|
|||||||
else
|
else
|
||||||
httpd->content_type = "application/octet-stream";
|
httpd->content_type = "application/octet-stream";
|
||||||
|
|
||||||
|
httpd->clients_max = config_get_block_unsigned(param,"max_clients", 0);
|
||||||
|
|
||||||
/* initialize listen address */
|
/* initialize listen address */
|
||||||
|
|
||||||
sin = (struct sockaddr_in *)&httpd->address;
|
sin = (struct sockaddr_in *)&httpd->address;
|
||||||
@ -124,6 +126,7 @@ httpd_client_add(struct httpd_output *httpd, int fd)
|
|||||||
httpd->encoder->plugin->tag == NULL);
|
httpd->encoder->plugin->tag == NULL);
|
||||||
|
|
||||||
httpd->clients = g_list_prepend(httpd->clients, client);
|
httpd->clients = g_list_prepend(httpd->clients, client);
|
||||||
|
httpd->clients_cnt++;
|
||||||
|
|
||||||
/* pass metadata to client */
|
/* pass metadata to client */
|
||||||
if (httpd->metadata)
|
if (httpd->metadata)
|
||||||
@ -146,10 +149,16 @@ httpd_listen_in_event(G_GNUC_UNUSED GIOChannel *source,
|
|||||||
connected */
|
connected */
|
||||||
|
|
||||||
fd = accept(httpd->fd, (struct sockaddr*)&sa, &sa_length);
|
fd = accept(httpd->fd, (struct sockaddr*)&sa, &sa_length);
|
||||||
if (fd >= 0)
|
if (fd >= 0) {
|
||||||
httpd_client_add(httpd, fd);
|
/* can we allow additional client */
|
||||||
else if (fd < 0 && errno != EINTR)
|
if (!httpd->clients_max ||
|
||||||
|
httpd->clients_cnt < httpd->clients_max)
|
||||||
|
httpd_client_add(httpd, fd);
|
||||||
|
else
|
||||||
|
close(fd);
|
||||||
|
} else if (fd < 0 && errno != EINTR) {
|
||||||
g_warning("accept() failed: %s", g_strerror(errno));
|
g_warning("accept() failed: %s", g_strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
g_mutex_unlock(httpd->mutex);
|
g_mutex_unlock(httpd->mutex);
|
||||||
|
|
||||||
@ -237,6 +246,7 @@ httpd_output_open(void *data, struct audio_format *audio_format,
|
|||||||
/* initialize other attributes */
|
/* initialize other attributes */
|
||||||
|
|
||||||
httpd->clients = NULL;
|
httpd->clients = NULL;
|
||||||
|
httpd->clients_cnt = 0;
|
||||||
httpd->timer = timer_new(audio_format);
|
httpd->timer = timer_new(audio_format);
|
||||||
|
|
||||||
g_mutex_unlock(httpd->mutex);
|
g_mutex_unlock(httpd->mutex);
|
||||||
@ -281,6 +291,7 @@ httpd_output_remove_client(struct httpd_output *httpd,
|
|||||||
assert(client != NULL);
|
assert(client != NULL);
|
||||||
|
|
||||||
httpd->clients = g_list_remove(httpd->clients, client);
|
httpd->clients = g_list_remove(httpd->clients, client);
|
||||||
|
httpd->clients_cnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user