[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