#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int opname,
void* optval, socklen_t* optlen);
int setsockopt(int sockfd, int level, int opname,
const void* optval, socklen_t optlen);
/*
Socket options
These socket options can be set by suing setsockopt() and read with
socketopt() with the socket level set to SOL_SOCKET for all sockets:
SO_ACCEPTCONN
Returns a value indicating whether or not this socket has been marked to
accept connections with listen(). The value 0 indicates that this is not
a listening socket, the value 1 indicates that this is a listening socket.
This socket option is read-only.
SO_BINDTODEVICE
Bind this socket to a particalar device like "eth0", as specified in the
passed interface name. If the name is an empty string or the option length
is zero, the socket device binding is removed. The passed option is a
variable-length null-terminated interface name string with the maximum size
of IFNAMSIZ. If a socket is bound to an interface, only packets revevied
from that particular interface are processed by the socket. Note that this
only works for some socket types, particularly AF_INET sockets. It is not
supportedfor packet sockets (use normal bind() there).
Before Linux 3.8, this socket option could be set, but could notretrieved
with getsockopt(). Since Linux 3.8, it is readable. The optlen argument
should contain the buffer size avaliable to receive the device name and
is recommended to be IFNAMSZ bytes. The real device name length is reported
back in the optlen argument.
SO_BROADCAST
Set or get the broadcast flag. When enabled, datagram sockets are allowed
to send packets to a broadcast address. This option has no effect on
stream-oriented sockets.
SO_BSDCOMPAT
Enable BSD bug-to-bug compatibility. This is used by the UDP protocol module
in Linux 2.0 and 2.2. If enabled ICMP errors received for a UDP socket will
not be passed to the user program. In later kernel versions, support for
this option has been phased out: Linux 2.4 silently ignores it, and Linux 2.6
generates a kernel warming (printk()) if a program uses this option.
Linux 2.0 also enabled BSD bug-to-bug compatibility options (random header
changing, skipping of the broadcast flag) for raw sockets whit this option,
but that was removed in Linux 2.2.
SO_DEBUG
Enable socket debugging. Only allowed for processes with the CAP_NET_ADMIN
capability or an effective user ID of 0.
SO_DOMAIN (since Linux 2.6.32)
Retrieves the socket domain as an integer, returning a value such as
AF_INET6. See socket(2) for details. This socket option is read-only.
SO_ERROR
Get and clear the pending socket error. This socket option is read-only.
Expects an integer.
SO_DONTROUTE
Don't send via a gateway, only send to directly connected hosts. The same
effect can be achieved by setting the MSG_DONTROUTE flag on a socket
send(2) operation. Expects an integer boolean flag.
SO_KEEPALIVE
Enable sending of keep-alive messages on connection-oriented sockets.
Expects an integer boolean flag.
SO_LINGER
Sets or gets the SO_LINGER option. The argument is a linger structure.
*/
struct linger {
int l_onoff; /* linger active */
int l_linger; /* how many seconds to linger for */
};
/*
When enable, a close(2) or shutdown(2) will not return until all queued
messages for the socket have been successfully sent or the linger timeout
has been reached.
Otherwise, the call returns immediately and the closing is done in the
background. When the socket is closed as part of exit(2), it always lingers
in the background.
SO_MARK (since Linux 2.6.25)
Set the mark for each packet sent through this socket (similar to the
netfilter MARK target but socket-based). Changing the mark can be used for
mark-based routing without netfilter or for packet filtering. Setting this
option requires the CAP_NET_ADMIN capability.
SO_OOBINLINE
If this option is enabled, out-of-band data is directly placed into the
receive data stream. Otherwise out-of-band data is only passed when the
MSG_OOB flag is set during receiving.
SO_PASSCRED
Enable or disable the receiving of the SCM_CREDENTIALS control message.
For more information see unix(7).
SO_PEERCRED
Return the credentials of the foreign process connected to this socket.
This is only possible for connected AF_UNIX stream sockets and AF_UNIX
stream and datagramsocket pairs created using socketpair(2); see unix(7).
The return credentials are those that were in effect at the time of the
call to connect(2) or socketpair(2). The argument is ucred structure;
define the GNU_SOURCE feature test macro to obtain the definition of that
structure from <sys/socket.h>. This socket option is read-only.
SO_PRIORITY
Set the protocol-defined priority for all packets to be sent on this socket.
LInux uses this value to order the networking queues: packets with a higher
priority may be processed first depending on the selected device queueing
discipline. For ip(7), this also sets the IP type-of-service(TOS) field for
outgoing packets. Setting a priority outside the range 0 to 6 requires the
CAP_NET_ADMIN capability.
SO_PROTOCOL (since Linux 2.6.32)
Retrieves the socket protocol as an integer, returning a value such as
IPPROTO_SCTP. See socket(2) for details. This socket option is read-only.
SO_RECVBUF
Sets or gets the maximum socket receive buffer in bytes. The kernel doubles
this value (to allow space for bookeeping overhead) when it is set using
setsocketopt(2), and this doubled value is returned by getsockopt(2). The
default value is set by the /proc/sys/net/core/rmem_default file, and the
maximum allowed value is set by the /proc/sys/net/core/rmem_max file. The
minimum (doubled) value for this option is 256.
SO_RCVBUFFORCE (since Linux 2.6.14)
Using this socket option, a privileged (CAP_NET_ADMIN) process can perform
the same task as SO_RECVBUF, but the rmem_max limit can be overridden.
SO_RCVLOWAT and SO_SNDLOWAT
Specify the minimum number of bytes in the buffer until the socket layer will
pass the data to the protocol (SO_SNDLOWAT) or the user on receiving
(SO_RCVLOWAT). These two values are initialized to 1. SO_SNDLOWAT is not
changeable on Linux (setsockopt(2) fails with the error ENOPROTOOPT).
SO_RCVLOWAT is changeable only since Linux 2.4. The select(2) and poll(2)
system calls currently do not respect the SO_RCVLOWAT setting on Linux, and
mark a socket readable when even a single byte of data is available. A
subsequent read from the socket will block until SO_RCVLOWAT bytes are
available.
SO_RCVTIMEO and SO_SNDTIMEO
Specify the receiving or sending timeouts until reporting an error. The
argument is a struct timeval. If an input or output function block for this
period of time, and data has been sent or received, the return value of that
function will be the amount of data transfered; if no data has been
transferred and the timeout has been reached then -1 is returned with errno
set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if the
socket was specified to be nonblocking. If the timeout is set to zero (the
default) then the operation will never timeout. Timeouts only have effect
for system calls that perform socket I/O (e.g., read(2), recvmsg(2), send(2),
sendmsg(2)); timeouts have no effect for select(2), poll(2), epoll_wait(2),
and so on.
SO_REUSEADDR
Indicates that the rules in validating addresses supplied in a bind(2) call
should allow reuse of local addresses. For AF_INET sockets this means that a
socket may bind, except when there is an active listening socket bound to the
address. When the listening socket is bound to INADDR_ANY with a specific
port then it is not possible to bind to this port for any local address.
Argument is an integer boolean flag.
SO_SNDBUF
Sets or gets the maximum socket send buffer in bytes. The kernel doubles
this value (to allow space for bookkeeping overhead) when it is set using
setsockopt(2), and this doubled value is returned by getsockopt(2). The
default value is set by the /proc/sys/net/core/wmem_default file and the
maximum allowed value is set by the /proc/sys/net/core/wmem_max file.
The minimum (doubled) value for this option is 2048.
SO_SNDBUFFFORCE (since Linux 2.6.14)
Using this socket option, a privileged (CAP_NET_ADMIN) prcess can perform the
same task as SO_SNDBUF, but the wmem_max can be overridden.
SO_TIMESTAMP
Enable or disable the receiving of the SO_TIMESTAMP control message. The
timestamp control message is sent with level SOL_SOCKET and the cmsg_data
filed is a struct timeval indicating the reception time of the last packet
passed to the user in this call. See cmsg(3) for details on control messages.
SO_TYPE
Gets the socket type as an integer(e.g., SOCK_STREAM). This socket option
is read-only.
*/
/*
Socket options
IP supports some prtocol-specific socket options that can be set whit
setsockopt(2) and read with getsockopt(2). The socket option level for IP is
IPPROTO_IP. A boolean integer flag is zero when it is false, otherwise true.
IP_ADD_MEMBERSHIP (since Linux 1.2)
Join a multicast group. Argument is an ip_mreqn structure.
*/
struct ip_mreqn {
struct in_addr imr_multiaddr; /* IP multicast group address */
struct in_addr imr_address; /* IP address of local interface */
int imr_ifindex; /* interface index */
};
/*
imr_multiaddr contains the address of the multicast group the application
wants to join or leave. It must be a valid multicast address (or
setsockopt(2) fails with the error EINVAL). imr_address is the address of
the local interface with whick the system should join the multicast group;
if it is equal to INADDR_ANY na appropriate interface is chosen by the
system. imr_ifindex is the interface index of the interface that should
join/leave the imr_multiaddr group, or 0 to indicate any interface. The
ip_mreqn structure is available only since Linux 2.2. For compatibility,
the old ip_mreq structure (present since Linux 1.2) is still supported;
it differs from ip_mreqn only by not including the imr_ifindex fileld.
Only valid as a setsockopt(2).
IP_BLOCK_SOURCE (since Linux 2.4.22 / 2.5.68)
Stop receiving multicast data from a specific source in a given group.
This is valid only after the application has subscribed to the multicast
group using eigher IP_ADD_MEMBERSHOP or IP_ADD_SOURCE_MEMBERSHOP. Argument
is an ip_mreq_source structure as described under IP_ADD_SOURCE_MEMBERSHOP.
IP_DROP_MEMBERSHOP (since Linux 1.2)
Leave a multicast group. Argument is an ip_mreqn or ip_mreq structure
similar to IP_ADD_MEMBERSHOP.
IP_DROP_SOURCE_MEMBERSHOP (since Linux 2.4.22 / 2.5.64)
Leave a source-specific group-that is, stop receiving data from a given
multicast group that come from a given source. If the application has
subscribed to multiple sources within the same group, data from the
remaining sources will still be delivered. To stop receiving data from all
sources at once, use IP_LEAVE_GROUP. Argument is an ip_mreq_source
structure as described under IP_ADD_SOURCE_MEMBERSHOP.
IP_FREEBIND (since Linux 2.4)
If enabled, this boolean option allows binding to an IP address that is
nonlocal or does not (yet) exit. This permits listening on a socket, without
requiring the underlying network interface or the specified dynamic IP
address to be up at the time that the application is trying to bind to it.
This option is the per-socket equivalent of the ip_nonlocal_bind /proc
interface described below.
IP_HDRINCL (since Linux 2.0)
If enabled, the user supplies an IP header in front of the user data. Only
valid for SOCK_RAW sockets. See raw(7) for some information. When this flag
is enabled the values et by IP_OPTIONS, IP_TTL and IP_TOS are ignored.
IP_MSFILTER (since Linux 2.4.22 / 2.5.68)
This option provides access to the advanced full-state filtering API.
Argument is an ip_msfilter structure.
*/
struct ip_msfilter {
struct in_addr imsf_multiaddr; /* IP multicast group address */
struct in_addr imsf_interface; /* IP address of local interface */
uint32_t imsf_fmode; /* Filter-mode */
uint32_t imsf_numsrc; /* Number of sources in the following array */
struct in_addr imsf_slist[1]; /* array of source addresses */
};
/*
There are two macros, MCAST_INCLUDE and MCAST_EXCLUDE, which can be used to
specify the filtering mode. Additionally, the IP_MSFILTER_SIZE(n) macros
exists to determine how much memory is needed to store ip_msfilter structure
with n sources in the source list. For the full description of multicast
source filtering refer to RFC 3376.
IP_MTU (since Linux 2.2)
Retrieve the current known path MTU of the current socket. Only valid when
the socket has been connected. Returns an integer. Only valid as a
getsockopt(2).
IP_MTU_DISCOVER (since Linux 2.2)
Set or receive the Path MTU Discovery setting for a socket. When enabled,
Linux will perform Path MTU Discovery as defined in RFC 1191 on SOCK_STREAM
sockets. For non-SOCK_STREAM sockets, IP_PMTUDISC_DO forces the
don't-fragment flag to be set on all outgoing packets. It is the user's
responsibility to pakcetize the data in MTU-sized chunks and to do the
retransmits if necessary. The kernel will reject (with EMSGIZE) dtagrams
that are bigger than the known path MTU. IP_PMTUDISC_WANT will fragment a
datagram if needed according to the path MTU, or will set the don't-fragment
flag otherwise.
The system-wide default can be toggled between IP_PMTUDISC_WANT and
IP_PMTUDISC_DONT bywriting (respectively, zero and nonzero values) to the
/proc/sys/net/ipv4/ip_no_pmtu_disc file.
When PMTU discovery is enabled, the kernel automatically keeps track of the
path MTU per destination host. When it is connected to a specific peer
with connect(2), the currently known path MTU can be retrieved conveniently
using the IP_MTU socket option (e.g., afger an EMSGSIZE error occcured).
The path MTU may change over time. For connectionless sockets with many
destinations, the new MTU for a given destination can also be accessed
using the error queue (see IP_RECVERR). A new error will be queued for
every incoming MTU update.
While MTU discovery is in progress, initial packets from datagram sockets
may be dropped. Applications using UDP should be aware of this and not
take it into account for their packet restransmit strategy.
To bootstrap the path MTU discovery process on unconnected sockets, it is
possible to start with a big datagram size (up to 64K-header bytes long)
and let it shrink by updates of the path MTU.
To get an initial estimate of the path MTU, connect a datagram socket to
the destination address using connect(2) and retrieve the MTU by calling
getsockopt(2) with the IP_MTU option.
It is possible to implement RFC 4821 MTU probing with SOCK_DGRAM or SOCK_RAW
sockets by setting a value of IP_PMTUDISC_PROBE (available since
Linux 2.6.22). This is also particularly useful for diagnostic tools
such as tracepath(8) that wish to deliberately send probe packets large
than the observed Path MTU.
IP_MULTICAST_IF (since Linux 1.2)
Set the local device for a multicast socket. Argument is an ip_mreqn or
ip_mreq structure similar to IP_ADD_MEMBERSHOP. When an invalid socket
option is passed, ENOPROTOOPT is returned.
IP_MULTICAST_LOOP (since Linux 1.2)
Set or read a boolean integer argument that determines whether sent
multicast packets should be looped back to the local sockets.
IP_MULTICAST_TTL (since Linux 1.2)
Set or read the time-to-live value of outgoing multicast packets for this
socket. It is very important for multicast packets to set the smallest TTL
possible. The default is 1 which means that multicast packets don't levave
the local network unless the user program explicitly requests it. Argument
is an integer.
IP_NODEFRAG (since Linux 2.6.36)
If enabled (argument is nonzero), the reassembly of outgoing packets is
disable in the netfilter layer. This option is only valid for SOCK_RAW
sockets. The argument is an integer.
IP_OPTIONS (since Linux 2.0)
Set or get the IP options to be sent with every packet from this socket.
The arguments are a pointer to a memory buffer containing the options and
the option length. The setsockopt(2) call sets the IP options associated
with a socket. The maximum option size for IPv4 is 40 bytes. See RFC 791
for the allowed options. When the initial connection request packet for a
SOCK_STREAM socket contains IP options, the IP options will be set
automatically to the options from the initial packet with routing headers
reversed. Incoming packets are not allowed to change options after the
connection is established. The processing of all incoming source routing
options is disabled by default and can be enabled by using the
accept_source_route /proc interface. Other options like timestamps are
still handled. For datagram sockets, IP options can be only set by the
local user. Calling getsockopt(2) with IP_OPTIONS puts the current IP
options used for sending into the supplied buffer.
IP_PKTINFO (since Linux 2.2)
Pass an IP_PKTINFO ancillary message that contains a pktinfo structure that
supplies some information about the incoming packet. This only works for
datagram oriented sockets. The argument is a flag that tells the socket
whether the IP_PKTINFO message should be passed or not. The message itself
can only be sent/retrieved as control message with a packet using
recvmsg(2) or sendmsg(2).
*/
struct in_pktinfo {
unsigned int ipi_ifindex; /* Interface index */
struct in_addr ipi_spec_dst; /* Local address */
struct in_addr pip_addr; /* Header Destination address */
};
/*
pip_ifindex is the unique index of the interface the packet was received on.
ipi_spec_dst is the local address of the packet and ipi_addr is the
destination address in the packet header. If IP_PKTINFO is passed to
sendmsg(2) and ipi_spec_dst is not zero, then it is used as the local
source address for the routing table loopup and for setting up IP source
route options. When ipi_ifindex is not zero, the primary local address of
the interface specified by the index overwrites ipi_spec_dst for the
routing table loopup.
IP_RECVERR (since Linux 2.2)
Enable extended reliable error message passing. When enable on a datagram
socket, all generated errors will be queued in a per-socket error queue.
When the user receives an error from a socket operation, the errors can be
received by calling recvmsg(2) with the MSG_ERRQUEUE flag set. The
sock_extended_err structure describing the error will be passed in an
ancillary message with the type IP_RECVERR and the level IPPROTO_IP. This
is useful for reliable error handling on unconnected sockets. The received
data portion of the error queue contains the error packet. The IP_RECVERR
control message contains a sock_extended_err structure:
*/
#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
struct sock_extended_err {
uint32_t ee_errno; /* error number */
uint8_t ee_origin; /* where the error originated */
uint8_t ee_type; /* type */
uint8_t ee_code; /* code */
uint8_t ee_pad;
uint32_t ee_info; /* additional information */
uint32_t ee_data; /* other data */
/* More data may follow */
};
struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err* );
/*
ee_errno contains the errno number of the queued error. ee_origin is the
origin code of where the error originated. The other fields are
protocol-specific. The macro SO_EE_OFFENDER returns a pointer to the
address of the network object where the error originated from given a
pointer to the ancillary message. If this address is not know, the
as_family member of the sockaddr contains AF_UNSPEC and the other fields
of the sockaddr are undefined.
IP uses the sock_extended_err structure as follows: ee_origin is set to
SO_EE_ORGIN_ICMP for errors received as an ICMP packet, or
SO_EE_ORIGIN_LOCAL for locally generated errors. Unknown values should be
ignored. ee_type and ee_code are set from the type and code fields of
the ICMP header. ee_info contaions the discovered MTU for EMSGSIZE errors.
The message also contains the sockaddr_in of the node caused the error,
which can be accessed with the SO_EE_OFFENDER macro. The sin_family field
of the SO_EE_OFFENDER address is AF_UNSPEC when the source was unknown.
When the error originated from the network, all IP options (IP_OPTIONS,
IP_TTL, etc.) enabled on the socket and contained in the error packet are
passed as control messages. The payload of the packet causing the error is
returned as normal payload. Note that TCP has no error queue; MSG_ERRQUEUE
is not permitted on SOCK_STREAM sockets. IP_RECVERR is valid for TCP, but
all errors are returned by socket function return or SO_ERROR only.
For raw sockets, IP_RECVERR enabled passing of all received IMCP errors to
the application, otherwise errors are only reported on connected sockets.
It sets or retrieves an integer boolean flag. IP_RECVERR defaluts to off.
IP_RECVOPTS (since Linux 2.2)
Pass all incoming IP options to the user in a IP_OPTIONS control message.
The routing header and other options are already filled in for the local
host. Not supported for received. The ancillary message contains a struct
sockaddr_in.
IP_RECVTOS (since Linux 2.2)
If enabled the IP_TOS ancillary message is passed with incoming packets.
It contains a byte which specifies the Ytpe of Service/Precedence field of
the packet header.
Expects a boolean integer flag.
IP_RECVTTL (since Linux 2.2)
When this flag is set, pass a IP_TTL control message with the time to live
field of the received packet as a byte. Not supported for SCOK_STREAM
sockets.
IP_RETOPTS (since Linux 2.2)
Identical to IP_RECVOPTS, but returns raw unprocessed options with timestamp
and route record options not filled in for this hop.
IP_ROUTER_ALERT (since Linux 2.2)
Pass all to-be forwarded packets with the IP Router Alert option set to this
socket. Only valid for raw sockets. This is useful, for instance, for
user-space RSVP daemons. The tapped packets are not forwarded by the kernel;
it is the user's responsibility to send them out again. Socket binding is
ignored, such packets are only filtered by protocol. Expects an integer flag.
IP_TOS (since Linux 1.0)
Set or receive the Type-Of-Service (TOS) field that is sent with every IP
packet originationg from this socket. It is used to prioritize packets on
the network. TOS is a byte. There are some standard TOS flags defined:
IPTOS_LOWDELAY to minimize delays for interactive traffic, IPTOS_THROUGHPUT
to optimize throughput, IPTOS_RELIABILITY to optimize for reliability,
IPTOS_MINCOST should be used for "filler data" where slow transmission
doesn't matter. At most one of these TOS values can be specified. Other
bits are invalid and shall be cleared. Linux sends IPTOS_LOWDELAY datagrams
first by default, but the exact behavior depends on the configured queueing
discipline. Some high priority levels may require superuser privileges
(the CAP_NET_ADMIN capability). The priority can also be set in a protocol
independent way by the (SOL_SOCKET, SO_PRIORITY) socket option
(see socket(7)).
IP_TRANSPARENT (since Linux 2.6.24)
setting this boolean option enables transparent proxying on this socket.
This socket option allows the calling application to bind to a nonlocal IP
address and operate both as a client and a server with the foreign address
as the local endpoint. NOTE: this requires that routing be set up in a way
that packets going to the foreign address are routed through the TProxy box.
Enabling this socket option requires superuser privileges (the CAP_NET_ADMIN
capability).
TProxy redirection with the iptables TPROXY target also requires that this
option be set on the redirected socket.
IP_TTL (since Linux 1.0)
set or retrieve the current time-to-live field that is used in every packet
sent from this socket.
IP_UNBLOCK_SOURCE (since Linux 2.4.22 / 2.5.68)
Unblock previously blocked mulitcast source. Returns EADDRNOTAVAIL when
given source is not being blocked.
Argument is an ip_mreq_source structure as described under
IP_ADD_SOURCE_MEMBERSHOP.
*/
/*
Socket options
To set or get a TCP socket option, call getsockopt(2) to read or setsockopt(2)
to write the option with the option level argument set to IPPROTO_TCP.
In addition, most IPPROTO_IP socket options are valid on TCP sockets. For more
information see ip(7).
TCP_CORK (since Linux 2.2)
If set, don't send out partial frames. All queued partial frames are sent
when the option is cleared again. This is useful for prepending headers
before calling sendfile(2), or for throughput optimization. As currently
implemented, there is a 200 millisecond ceiling on the time for which
output is corked by TCP_CORK. If this ceiling is reached, then queued data
is auto matically transmitted. This option can be combined with TCP_NODELAY
only since Linux 2.5.71. This option should not be used in code intended
to be portable.
TCP_DEFER_ACCEPT (since Linux 2.4)
Allow a listener to be awakened only when data arrives on the socket. Takes
an integer value (seconds), this can bound the maximum number of attempts
TCP will make to complete the connection. This option should not be used
in code intended to be portable.
TCP_INFO (since Linux 2.4)
Used to collect information about this socket. The kernel returns a struct
tcp_info as defined in the file /usr/include/linux/tcp.h. This option should
not be used in code intended to be portable.
TCP_KEEPCNT (since Linux 2.4)
The maximum number of keepalive probes TCP should send before dropping the
connection. This option should not be used in code intended to be portable.
TCP_KEEPIDLE (since Linux 2.4)
The time (in seconds) the connection needs to remain idle before TCP starts
sending keepalive probes, if the socket option SO_KEEPALIVE has been set on
this socket. This option should not be used in code intended to be portable.
TCP_KEEPINTVL (since Linux 2.4)
This time (in seconds) between individual keepalive prbes. This option
should not be used in code intended to be portable.
TCP_LINGER2 (since Linux 2.4)
The lifetime of orphaned FIN_WAIT2 state sockets. This option can be used
to override the system-wide setting in the file
/proc/sys/net/ipv4/tcp_fin_timeout for this socket. This not tobe confused
with the socket(7) level option SO_LINGER. This option should not be used
in code intended to be portable.
TCP_MAXSEG
The maximum segment size for outgoing TCP packets. In Linux 2.2 and
earlier, and in Linux 2.6.28 and later, if this option is set before
connection establishment, it also changes the MSS value announced to the
other end in the initial packet. Values greater than the (eventual)
interface MTU have no effect. TCP will also impose its minimum and maximum
bounds over the value provided.
TCP_NODELAY
If set, disable the Nagle algorithm. This means that segments are always
sent as soon as possible, even if there is only a small amount of data.
When not set, data is buffered until there is a sufficient amount to send
out, thereby avoiding the frequent sending of small packets, which results
in poor utilization of the network. This option is overridden by TCP_CORK;
however, setting this option forces an explicit flush of pending output,
even if TCP_CORK is currently set.
TCP_QUICKACK (since Linux 2.4.4)
Enable quickack mode if set or disable quickack mode, acks are sent
immediately, rather that delayed if needed in accordance to normal TCP
operation. This flag is not permanent, it only enables a switch to or from
quickack mode. Subsequent operation of the TCP protocol will once again
enter/leave quickack mode depending on internal protocol processing and
factors such as delayed ack timeouts occurring and data transfer. This
option should not be used in code intended to be portable.
TCP_SYNCNT (since Linux 2.4)
Set the number of SYN retransmits that TCP should send before aborting the
attempt to connect. It cannot exceed 255. This option should not be used in
code intended to be portable.
TCP_WINDOW_CLAMP (since LInux 2.4)
Bound the size of the advertised window to this value. The kernel imposes a
minimum size of SOCK_MIN_RCVBUF/2. This option should not be used in code
intended to be portable.
*/