Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

setsockopt() changes an option on a socket. Its five arguments identify the socket, select the protocol level and option, and provide the option value and its byte length. The key is to use the level and value representation required by that specific option: common socket-wide options use SOL_SOCKET, while TCP options use IPPROTO_TCP.

What setsockopt() does and how its arguments work

Linux declares the function as int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);. The Linux man page summarizes the purpose: “getsockopt() and setsockopt() manipulate options for the socket referred to by the file descriptor sockfd.” Linux setsockopt(2)

  • sockfd: the file descriptor for the socket to change.
  • level: the protocol layer that owns the option, such as SOL_SOCKET for generic socket options or IPPROTO_TCP for TCP options.
  • optname: the option name, such as SO_REUSEADDR or TCP_NODELAY.
  • optval: a pointer to the option’s value in the representation it requires.
  • optlen: the size, in bytes, of the value supplied through optval.

POSIX likewise defines the call in terms of an option name, a protocol level, and the pointed-to value for the socket. The Open Group: setsockopt()

For many Boolean options at SOL_SOCKET, Linux expects optval to point to an int: a nonzero value enables the option and zero disables it. That is a common convention, not a universal rule. Some options take structures, strings, file descriptors, or other protocol-specific data. The option’s manual page specifies both its required representation and length.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Basic call examples

Enable a generic socket option

This example enables SO_REUSEADDR on an existing socket descriptor. Set the option before binding if the intended effect concerns the upcoming bind; the right lifecycle point depends on the option.

int enabled = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
               &enabled, sizeof(enabled)) == -1) {
    perror("setsockopt SO_REUSEADDR");
}

Disable Nagle’s algorithm for TCP

TCP_NODELAY belongs to the TCP protocol level, so this call uses IPPROTO_TCP, not SOL_SOCKET.

int enabled = 1;
if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY,
               &enabled, sizeof(enabled)) == -1) {
    perror("setsockopt TCP_NODELAY");
}

These examples use an integer because these particular options accept one on Linux. For any other option, check its documentation rather than assuming the same type.

Choosing a level and option

Use the level that owns the option. SOL_SOCKET covers generic socket-layer settings; IPPROTO_TCP covers TCP-specific behavior. Other protocol levels include IPPROTO_IP and IPPROTO_IPV6. An option name paired with the wrong level may be unrecognized even when the name itself is valid.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Common SOL_SOCKET options

The Linux socket(7) catalog groups options for generic socket behavior. Linux socket(7)

  • SO_REUSEADDR and SO_REUSEPORT: affect address and port binding. Their exact semantics differ; do not treat them as interchangeable.
  • SO_BROADCAST: controls permission to send broadcast datagrams.
  • SO_RCVBUF and SO_SNDBUF: configure receive and send buffering, with potential consequences for memory use and throughput.
  • SO_RCVTIMEO and SO_SNDTIMEO: set receive and send timeouts.
  • SO_KEEPALIVE: enables keepalive behavior. TCP-specific timing and probe-count settings use separate TCP-level options.
  • SO_LINGER: controls close behavior through a value with its own required representation.
  • SO_ATTACH_FILTER and SO_ATTACH_BPF: attach packet filters. Linux documents classic BPF attachment since Linux 2.2 and extended BPF attachment since Linux 3.19.
  • SO_ACCEPTCONN: read-only status indicating whether listen(2) has marked the socket as listening; it is queried rather than set.

Common IPPROTO_TCP options

TCP options use level = IPPROTO_TCP. Consult tcp(7) for option-specific types, timing rules, and Linux constraints. Linux tcp(7)

  • TCP_NODELAY disables Nagle buffering so small segments can be sent promptly. It can favor latency over batching; it does not guarantee better performance for every workload.
  • TCP_CORK holds partial frames for batching. Linux documents a 200-millisecond ceiling; it is not a general substitute for understanding the application’s write and flush behavior.
  • TCP_CONGESTION selects a per-socket congestion-control algorithm, subject to the algorithms allowed on the system and relevant privilege restrictions.
  • TCP_DEFER_ACCEPT affects when a listening socket is awakened for an incoming connection.
  • TCP_KEEPIDLE, TCP_KEEPINTVL, and TCP_KEEPCNT tune keepalive timing and probe count; use them with SO_KEEPALIVE.
  • TCP_USER_TIMEOUT limits how long a synchronized connection may remain without successful end-to-end progress. A shorter limit can detect failure sooner but tolerate less delay.
  • TCP_WINDOW_CLAMP limits the advertised receive window.

Compare options before setting them

For a new option, verify these details in its manual page before choosing a value or placing the call in your connection setup:

Check What to verify Why it matters
Protocol level SOL_SOCKET, IPPROTO_TCP, IPPROTO_IP, IPPROTO_IPV6, or another documented level. The level identifies which protocol interprets optname.
Value representation Required type—such as int, structure, string, file descriptor, or protocol-specific buffer—and exact optlen. A valid option name can still fail if the value pointer or byte count is wrong.
Lifecycle timing Whether to set it before bind(2), connect(2), or listen(2), or whether it can change on an established connection. Some settings affect setup or listener behavior; others can be adjusted later.
Behavioral trade-off For example, latency versus batching, failure-detection speed versus tolerance, or buffer use versus throughput. Options change mechanisms and constraints; they do not promise a universal performance gain.
Portability and privilege Whether the option is part of portable POSIX behavior or Linux-specific, and whether it requires a capability such as CAP_NET_ADMIN. Linux extensions and privileged operations may not work in other environments or under ordinary permissions.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Why setsockopt() fails

On success, the call returns 0. On failure, it returns -1 and sets errno. Linux documents these common errors:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • EBADF: sockfd is not a valid file descriptor.
  • EFAULT: the option-value pointer refers to an invalid address.
  • EINVAL: the option length is invalid or, for some options, the value is invalid.
  • ENOPROTOOPT: the selected protocol level does not recognize that option.
  • ENOTSOCK: the descriptor refers to something other than a socket.

When diagnosing a failure, first confirm the descriptor is a socket, then check the level-option pairing, the option’s exact value type and byte length, and any documented value, timing, or privilege restrictions. Linux setsockopt(2) errors

Portability: POSIX contract versus Linux options

The setsockopt() interface is specified by POSIX.1-2024 and has historical roots in POSIX.1-2001, SVr4, and 4.4BSD; the interface first appeared in 4.2BSD. The portable function contract does not make every option portable: Linux-specific option names and semantics extend beyond the base interface. The Linux TCP manual warns that several TCP options should not be used in code intended to be portable. If an application must run across Unix-like systems, check each target system’s documentation and feature availability rather than relying on a Linux option merely because the function exists elsewhere. Linux setsockopt(2) history and standards Linux tcp(7) portability notes

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.