diff --git a/doc/ffserver.conf b/doc/ffserver.conf index cae1a140c9..2fbfecd683 100644 --- a/doc/ffserver.conf +++ b/doc/ffserver.conf @@ -7,6 +7,11 @@ Port 8090 # several network interfaces. BindAddress 0.0.0.0 +# Number of simultaneous HTTP connections that can be handled. It has +# to be defined *before* the MaxClients parameter, since it defines the +# MaxClients maximum limit. +MaxHTTPConnections 2000 + # Number of simultaneous requests that can be handled. Since FFServer # is very fast, it is more likely that you will want to leave this high # and use MaxBandwidth, below. diff --git a/ffserver.c b/ffserver.c index 08b89a885f..f7d00eabf3 100644 --- a/ffserver.c +++ b/ffserver.c @@ -62,9 +62,6 @@ const int program_birth_year = 2000; static const OptionDef options[]; -/* maximum number of simultaneous HTTP connections */ -#define HTTP_MAX_CONNECTIONS 2000 - enum HTTPState { HTTPSTATE_WAIT_REQUEST, HTTPSTATE_SEND_HEADER, @@ -295,6 +292,8 @@ static int ffserver_daemon; static int no_launch; static int need_to_start_children; +/* maximum number of simultaneous HTTP connections */ +static unsigned int nb_max_http_connections = 2000; static int nb_max_connections = 5; static int nb_connections; @@ -543,9 +542,14 @@ static int http_server(void) { int server_fd = 0, rtsp_server_fd = 0; int ret, delay, delay1; - struct pollfd poll_table[HTTP_MAX_CONNECTIONS + 2], *poll_entry; + struct pollfd *poll_table, *poll_entry; HTTPContext *c, *c_next; + if(!(poll_table = av_mallocz(nb_max_http_connections + 2))) { + http_log("Impossible to allocate a poll table handling %d connections.\n", nb_max_http_connections); + return -1; + } + if (my_http_addr.sin_port) { server_fd = socket_open_listen(&my_http_addr); if (server_fd < 0) @@ -3816,10 +3820,19 @@ static int parse_ffconfig(const char *filename) filename, line_num, arg); errors++; } + } else if (!strcasecmp(cmd, "MaxHTTPConnections")) { + get_arg(arg, sizeof(arg), &p); + val = atoi(arg); + if (val < 1 || val > 65536) { + fprintf(stderr, "%s:%d: Invalid MaxHTTPConnections: %s\n", + filename, line_num, arg); + errors++; + } + nb_max_http_connections = val; } else if (!strcasecmp(cmd, "MaxClients")) { get_arg(arg, sizeof(arg), &p); val = atoi(arg); - if (val < 1 || val > HTTP_MAX_CONNECTIONS) { + if (val < 1 || val > nb_max_http_connections) { fprintf(stderr, "%s:%d: Invalid MaxClients: %s\n", filename, line_num, arg); errors++;