• Joel Cunningham's avatar
    tcp: set socket buffer sizes before listen/connect/accept · f3778108
    Joel Cunningham authored
    From e24d95c0e06a878d401ee34fd6742fcaddeeb95f Mon Sep 17 00:00:00 2001
    From: Joel Cunningham <joel.cunningham@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: 's avatarJoel Cunningham <joel.cunningham@me.com>
    Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
    f3778108
Name
Last commit
Last update
compat Loading commit data...
doc Loading commit data...
libavcodec Loading commit data...
libavdevice Loading commit data...
libavfilter Loading commit data...
libavformat Loading commit data...
libavresample Loading commit data...
libavutil Loading commit data...
libpostproc Loading commit data...
libswresample Loading commit data...
libswscale Loading commit data...
presets Loading commit data...
tests Loading commit data...
tools Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.travis.yml Loading commit data...
CONTRIBUTING.md Loading commit data...
COPYING.GPLv2 Loading commit data...
COPYING.GPLv3 Loading commit data...
COPYING.LGPLv2.1 Loading commit data...
COPYING.LGPLv3 Loading commit data...
CREDITS Loading commit data...
Changelog Loading commit data...
INSTALL.md Loading commit data...
LICENSE.md Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README.md Loading commit data...
RELEASE Loading commit data...
arch.mak Loading commit data...
cmdutils.c Loading commit data...
cmdutils.h Loading commit data...
cmdutils_common_opts.h Loading commit data...
cmdutils_opencl.c Loading commit data...
common.mak Loading commit data...
configure Loading commit data...
ffmpeg.c Loading commit data...
ffmpeg.h Loading commit data...
ffmpeg_cuvid.c Loading commit data...
ffmpeg_dxva2.c Loading commit data...
ffmpeg_filter.c Loading commit data...
ffmpeg_opt.c Loading commit data...
ffmpeg_qsv.c Loading commit data...
ffmpeg_vaapi.c Loading commit data...
ffmpeg_vdpau.c Loading commit data...
ffmpeg_videotoolbox.c Loading commit data...
ffplay.c Loading commit data...
ffprobe.c Loading commit data...
ffserver.c Loading commit data...
ffserver_config.c Loading commit data...
ffserver_config.h Loading commit data...
library.mak Loading commit data...
version.sh Loading commit data...