[FFmpeg-devel] [PATCH] tcp: set socket buffer sizes before listen/connect/accept

Joel Cunningham joel.cunningham at me.com
Wed Jan 25 17:06:36 EET 2017


Ping!  Anyone have a chance to look at this issue/patch?

Thanks,

Joel

> On Jan 9, 2017, at 2:54 PM, Joel Cunningham <joel.cunningham at me.com> wrote:
> 
> From e24d95c0e06a878d401ee34fd6742fcaddeeb95f Mon Sep 17 00:00:00 2001
> From: Joel Cunningham <joel.cunningham at me.com>
> Date: Mon, 9 Jan 2017 13:37:51 -0600
> Subject: [PATCH] tcp: set socket buffer sizes before listen/connect/accept
> 
> Attempting to set SO_RCVBUF and SO_SNDBUF on TCP sockets after connection
> establishment is incorrect and some stacks ignore the set call on the socket at
> this point.  This has been observed on MacOS/iOS.  Windows 7 has some peculiar
> behavior where setting SO_RCVBUF after applies only if the buffer is increasing
> from the default while decreases are ignored.  This is possibly how the incorrect
> usage has gone unnoticed
> 
> Unix Network Programming Vol. 1: The Sockets Networking API (3rd edition, seciton 7.5):
> 
> "When setting the size of the TCP socket receive buffer, the ordering of the
> function calls is important.  This is because of TCP's window scale option,
> which is exchanged with the peer on SYN segments when the connection is
> established. For a client, this means the SO_RCVBUF socket option must be
> set before calling connect.  For a server, this means the socket option must
> be set for the listening socket before calling listen.  Setting this option
> for the connected socket will have no effect whatsoever on the possible window
> scale option because accept does not return with the connected socket until
> TCP's three-way handshake is complete.  This is why the option must be set on
> the listening socket. (The sizes of the socket buffers are always inherited from
> the listening socket by the newly created connected socket)"
> 
> Signed-off-by: Joel Cunningham <joel.cunningham at me.com>
> ---
> libavformat/tcp.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/libavformat/tcp.c b/libavformat/tcp.c
> index 25abafc..5f00ba7 100644
> --- a/libavformat/tcp.c
> +++ b/libavformat/tcp.c
> @@ -140,6 +140,15 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
>         goto fail;
>     }
> 
> +    /* Set the socket's send or receive buffer sizes, if specified.
> +       If unspecified or setting fails, system default is used. */
> +    if (s->recv_buffer_size > 0) {
> +        setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &s->recv_buffer_size, sizeof (s->recv_buffer_size));
> +    }
> +    if (s->send_buffer_size > 0) {
> +        setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &s->send_buffer_size, sizeof (s->send_buffer_size));
> +    }
> +
>     if (s->listen == 2) {
>         // multi-client
>         if ((ret = ff_listen(fd, cur_ai->ai_addr, cur_ai->ai_addrlen)) < 0)
> @@ -164,14 +173,6 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
> 
>     h->is_streamed = 1;
>     s->fd = fd;
> -    /* Set the socket's send or receive buffer sizes, if specified.
> -       If unspecified or setting fails, system default is used. */
> -    if (s->recv_buffer_size > 0) {
> -        setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &s->recv_buffer_size, sizeof (s->recv_buffer_size));
> -    }
> -    if (s->send_buffer_size > 0) {
> -        setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &s->send_buffer_size, sizeof (s->send_buffer_size));
> -    }
> 
>     freeaddrinfo(ai);
>     return 0;
> -- 
> 2.10.0
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel



More information about the ffmpeg-devel mailing list