COMMENT(source: socat.yo)
mailto(socat@dest-unreach.org)

def(unix)(0)(UN*X)
def(unixdomain)(0)(UNIX domain)
def(socat)(0)(bf(socat))
def(Socat)(0)(bf(Socat))
def(filan)(0)(bf(filan))
def(Filan)(0)(bf(Filan))
def(procan)(0)(bf(procan))
def(Procan)(0)(bf(Procan))

manpage(socat)(1)()()()

htmlcommand(<link rel="stylesheet" type="text/css" href="dest-unreach.css">)

whenhtml(
label(CONTENTS)
manpagesection(CONTENTS)
link(NAME)(NAME)nl()
link(SYNOPSIS)(SYNOPSIS)nl()
link(DESCRIPTION)(DESCRIPTION)nl()
link(OPTIONS)(OPTIONS)nl()
link(ADDRESS SPECIFICATIONS)(ADDRESS_SPECIFICATIONS)nl()
link(ADDRESS TYPES)(ADDRESS_TYPES)nl()
link(ADDRESS OPTIONS)(ADDRESS_OPTIONS)nl()
link(DATA VALUES)(VALUES)nl()
link(EXAMPLES)(EXAMPLES)nl()
link(DIAGNOSTICS)(DIAGNOSTICS)nl()
link(FILES)(FILES)nl()
link(ENVIRONMENT VARIABLES)(ENVIRONMENT_VARIABLES)nl()
link(CREDITS)(CREDITS)nl()
link(VERSION)(VERSION)nl()
link(BUGS)(BUGS)nl()
link(SEE ALSO)(SEEALSO)nl()
)

label(NAME)
manpagename(socat) (Multipurpose relay (SOcket CAT))

label(SYNOPSIS)
manpagesynopsis()
tt(socat [options] <address> <address>)nl()
tt(socat -V)nl()
tt(socat -h[h[h]] | -?[?[?]])nl()
tt(filan)nl()
tt(procan)

label(DESCRIPTION)
manpagedescription()

Socat() is a command line based utility that establishes two bidirectional byte
streams and transfers data between them. Because the streams can be constructed
from a large set of different types of data sinks and sources 
(see link(address types)(ADDRESS_TYPES)), and because lots of
link(address options)(ADDRESS_OPTIONS) may be applied to the streams, socat can
be used for many different purposes. 

Filan() is a utility that prints information about its active file
descriptors to stdout. It has been written for debugging socat(), but might be
useful for other purposes too. Use the -h option to find more infos.

Procan() is a utility that prints information about process parameters to
stdout. It has been written to better understand 
some UNIX process properties and for debugging socat(), but might be 
useful for other purposes too.

The life cycle of a socat() instance typically consists of four phases.

In the em(init) phase, the command line options are parsed and logging is
initialized. 

During the em(open) phase, socat() opens the first address and afterwards the
second address. These steps are usually blocking; thus, especially for complex address types like socks,
connection requests or authentication dialogs must be completed before the next
step is started.

In the em(transfer) phase, socat() watches both streams' read and write file
descriptors via code(select()), and, when data is available on one side em(and)
can be written to the other side, socat reads it, performs newline
character conversions if required, and writes the data to the write file
descriptor of the other stream, then continues waiting for more data in both
directions.

When one of the streams effectively reaches EOF, the em(closing) phase
begins. Socat() transfers the EOF condition to the other stream,
i.e. tries to shutdown only its write stream, giving it a chance to
terminate gracefully. For a defined time socat() continues to transfer data in
the other direction, but then closes all remaining channels and terminates.


label(OPTIONS)
manpageoptions()

Socat() provides some command line options that modify the behaviour of the
program. They have nothing to do with so called
link(address options)(ADDRESS_OPTIONS) that are used as parts of link(address specifications)(ADDRESS_SPECIFICATIONS).

startdit()
dit(bf(tt(-V)))
   Print version and available feature information to stdout, and exit.
dit(bf(tt(-h | -?)))
   Print a help text to stdout describing command line options and available address
   types, and exit.
dit(bf(tt(-hh | -??)))
   Like -h, plus a list of the short names of all available address options. Some options are
   platform dependend, so this output is helpful for checking the particular
   implementation. 
dit(bf(tt(-hhh | -???)))
   Like -hh, plus a list of all available address option names.
label(option_d)dit(bf(tt(-d)))
   Without this option, only fatal, error, and warning messages are printed;
   applying this option also prints notice messages.
   See link(DIAGNOSTICS)(DIAGNOSTICS) for more information.
label(option_d0)dit(bf(tt(-d0)))
   With this option, only fatal and error messages are printed; this restores
   the behaviour of socat() up to version 1.7.4.
label(option_d_d)dit(bf(tt(-d -d | -dd | -d2))) Prints fatal, error, warning, and notice messages.
dit(bf(tt(-d -d -d | -ddd | -d3))) Prints fatal, error, warning, notice, and info messages.
dit(bf(tt(-d -d -d -d | -dddd | -d4))) Prints fatal, error, warning, notice, info, and debug
   messages. 
dit(bf(tt(-D)))
   Logs information about file descriptors before starting the transfer phase.
label(option_experimental)dit(bf(tt(--experimental)))
   New features that are not well tested or are subject to change in the future
   must me explicitely enabled using this option.
dit(bf(tt(-ly[<facility>])))
   Writes messages to syslog instead of stderr; severity as defined with -d
   option. With optional link(<facility>)(TYPE_FACILITY), the syslog type can
   be selected, default is "daemon". Third party libraries might not obey this
   option.
dit(bf(tt(-lf))tt( <logfile>))
   Writes messages to <logfile> [link(filename)(TYPE_FILENAME)] instead of
   stderr. Some third party libraries, in particular libwrap, might not obey
   this option.
dit(bf(tt(-ls)))
   Writes messages to stderr (this is the default). Some third party libraries 
   might not obey this option, in particular libwrap appears to only log to
   syslog. 
label(option_lp)dit(bf(tt(-lp))tt(<progname>))
   Overrides the program name printed in error messages and used for
   constructing environment variable names.
dit(bf(tt(-lu)))
   Extends the timestamp of error messages to microsecond resolution. Does not
   work when logging to syslog.
label(option_lm)dit(bf(tt(-lm[<facility>])))
   Mixed log mode. During startup messages are printed to stderr; when socat() 
   starts the transfer phase loop or daemon mode (i.e. after opening all
   streams and before starting data transfer, or, with listening sockets with
   fork option, before the first accept call), it switches logging to syslog. 
   With optional link(<facility>)(TYPE_FACILITY), the syslog type can be
   selected, default is "daemon". 
label(option_lh)dit(bf(tt(-lh)))
   Adds hostname to log messages. Uses the value from environment variable
   HOSTNAME or the value retrieved with tt(uname()) if HOSTNAME is not set.
dit(bf(tt(-v)))
   Writes the transferred data not only to their target streams, but also to
   stderr. The output format is text with some conversions for readability, and
   prefixed with "> " or "< " indicating flow directions.
dit(bf(tt(-x)))
   Writes the transferred data not only to their target streams, but also to
   stderr. The output format is hexadecimal, prefixed with "> " or "< "
   indicating flow directions. Can be combined with code(-v).
label(option_r)dit(bf(tt(-r <file>)))
   Dumps the raw (binary) data flowing from left to right address to the given
   file. The file name may contain references to environment variables and
   code($$) (pid), code($PROGNAME) (see option link(option -lp)(option_lp)),
   code($TIMESTAMP) (uses format %Y%m%dT%H%M%S), and code(MICROS) (microseconds
   of daytime). These references have to be protected from shell expansion of
   course.
dit(bf(tt(-R <file>)))
   Dumps the raw (binary) data flowing from right to left address to the given
   file. See link(option -r)(option_r) for customization of file name.
label(option_b)dit(bf(tt(-b))tt(<size>))
   Sets the data transfer block <size> [link(size_t)(TYPE_SIZE_T)].
   At most <size> bytes are transferred per step. Default is 8192 bytes. 
label(option_s)dit(bf(tt(-s)))
   By default, socat() terminates when an error occurred to prevent the process
   from running when some option could not be applied. With this
   option, socat() is sloppy with errors and tries to continue. Even with this
   option, socat will exit on fatals, and will abort connection attempts when
   security checks failed.
label(option_S)dit(bf(tt(-S))tt(<signals-bitmap>))
   Changes the set of signals that are caught by socat() just for printing an
   log message. This catching is useful to get the information about the signal
   into socat()s log, but prevents core dump or other standard actions. The
   default set of these signals is SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT,
   SIGBUS, SIGFPE, SIGSEGV, and SIGTERM; replace this set (0x89de on Linux)
   with a bitmap (e.g., SIGFPE has value 8 and its bit is 0x0080).nl()
   Note: Signals SIGHUP, SIGINT, SIGQUIT, SIGUSR1, SIGPIPE, SIGALRM, SIGTERM, and
   SIGCHLD may be handled specially anyway.
label(option_t)dit(bf(tt(-t))tt(<timeout>))
   When one channel has reached EOF, the write part of the other channel is shut
   down. Then, socat() waits <timeout> [link(timeval)(TYPE_TIMEVAL)] seconds
   before terminating. Default is 0.5 seconds. This timeout only applies to
   addresses where write and read part can be closed independently. When during
   the timeout interval the read part gives EOF, socat terminates without
   awaiting the timeout.
label(option_T)dit(bf(tt(-T))tt(<timeout>))
   Total inactivity timeout: when socat is already in the transfer loop and
   nothing has happened for <timeout> [link(timeval)(TYPE_TIMEVAL)] seconds
   (no data arrived, no interrupt occurred...) then it terminates.
   Useful with protocols like UDP that cannot transfer EOF.
label(option_u)dit(bf(tt(-u)))
   Uses unidirectional mode. The first address is only used for reading, and the
   second address is only used for writing (link(example)(EXAMPLE_option_u)). 
label(option_U)dit(bf(tt(-U)))
   Uses unidirectional mode in reverse direction. The first address is only
   used for writing, and the second address is only used for reading. 
label(option_g)dit(bf(tt(-g)))
   During address option parsing, don't check if the option is considered
   useful in the given address environment. Use it if you want to force, e.g.,
   appliance of a socket option to a serial device.
label(option_L)dit(bf(tt(-L))tt(<lockfile>))
   If lockfile exists, exits with error. If lockfile does not exist, creates it
   and continues, unlinks lockfile on exit.
label(option_W)dit(bf(tt(-W))tt(<lockfile>))
   If lockfile exists, waits until it disappears. When lockfile does not exist,
   creates it and continues, unlinks lockfile on exit.
label(option_4)dit(bf(tt(-4)))
   Use IP version 4 in case the addresses do not implicitly or explicitly
   specify a version; this is the default.
label(option_6)dit(bf(tt(-6)))
   Use IP version 6 in case the addresses do not implicitly or explicitly
   specify a version.
label(option_statistics)dit(bf(tt(--statistics)))
   Logs transfer statistics (bytes and blocks counters for both directions)
   before terminating Socat.nl()
   See also link(signal USR1)(signal_usr1).nl()
   This feature is experimental and might change in future versions.
enddit()


label(ADDRESS_SPECIFICATIONS)
manpagesection(ADDRESS SPECIFICATIONS)

With the address command line arguments, the user gives socat() instructions and
the necessary information for establishing the byte streams. 

An address specification usually consists of an address type
keyword, zero or more required address parameters separated by ':' from the keyword and
from each 
other, and zero or more address options separated by ','. 

The keyword specifies the address type (e.g., TCP4, OPEN, EXEC). For some
keywords there exist synonyms ('-' for STDIO, TCP for TCP4). Keywords are case
insensitive.
For a few special address types, the keyword may be omitted:
Address specifications starting with a number are assumed to be FD (raw file
descriptor) addresses; 
if a '/' is found before the first ':' or ',', GOPEN (generic file open) is
assumed. 

The required number and type of address parameters depend on the address
type. E.g., TCP4 requires a server specification (name or address), and a port
specification (number or service name). 

Zero or more address options may be given with each address. They influence the
address in some ways. 
Options consist of an option keyword or an option keyword and a value,
separated by '='. Option keywords are case insensitive.
For filtering the options that are useful with an address
type, each option is member of one option group. For
each address type there is a set of option groups allowed. Only options
belonging to one of these address groups may be used (except with link(option -g)(option_g)). 

label(ADDRESS_DUAL)
Address specifications following the above schema are also called em(single)
address specifications.
Two single addresses can be combined with "!!" to form a em(dual) type
address for one channel. Here, the first address is used by socat() for reading
data, and the 
second address for writing data. There is no way to specify an option only once
for being applied to both single addresses.

Usually, addresses are opened in read/write
mode. When an address is part of a dual address specification, or when
link(option -u)(option_u) or link(-U)(option_U) is used, an address might be
used only for reading or for writing. Considering this is important with some
address types.

With socat version 1.5.0 and higher, the lexical analysis tries to handle
quotes and parenthesis meaningfully and allows escaping of special characters. 
If one of the characters ( { [ ' is found, the corresponding closing 
character - ) } ] ' - is looked for; they may also be nested. Within these
constructs, socats special characters and strings : , !! are not handled
specially. All those characters and strings can be escaped with \ or within ""

label(ADDRESS_TYPES)
manpagesection(ADDRESS TYPES)

This section describes the available address types with their keywords,
parameters, and semantics.

startdit()
label(ADDRESS_CREAT)dit(bf(tt(CREATE:<filename>)))
   Opens link(<filename>)(TYPE_FILENAME) with code(creat()) and uses the file
   descriptor for writing. 
   This is a write-only address because a file opened with code(creat) cannot
   be read from. See options link(-u)(option_u) and
   link(-U)(option_U), and link(dual addresses)(ADDRESS_DUAL).nl()
   Flags like O_LARGEFILE cannot be applied. If you need them use
   link(OPEN)(ADDRESS_OPEN) with options
   link(create)(OPTION_O_CREAT),link(create)(OPTION_O_TRUNC). nl()
   <filename> must be a valid existing or not existing path.
   If <filename> is a named pipe, code(creat()) might block;
   if <filename> refers to a socket, this is an error.nl() 
   Option groups: link(FD)(GROUP_FD),link(REG)(GROUP_REG),link(NAMED)(GROUP_NAMED) nl()
   Useful options:
   link(mode)(OPTION_MODE),
   link(user)(OPTION_USER),
   link(group)(OPTION_GROUP),
   link(unlink-early)(OPTION_UNLINK_EARLY),
   link(unlink-late)(OPTION_UNLINK_LATE),
   link(append)(OPTION_APPEND)nl()
   See also: link(OPEN)(ADDRESS_OPEN), link(GOPEN)(ADDRESS_GOPEN)
label(ADDRESS_EXEC)dit(bf(tt(EXEC:<command-line>)))
   Forks a sub process that establishes communication with its parent process
   and invokes the specified program with code(execvp()).
   link(<command-line>)(TYPE_COMMAND_LINE) is a simple command
   with arguments separated by single spaces. If the program name
   contains a '/', the part after the last '/' is taken as ARGV[0]. If the
   program name is a relative 
   path, the code(execvp()) semantics for finding the program via
   code($PATH) 
   apply. After successful program start, socat() writes data to stdin of the
   process and reads from its stdout using a unixdomain() socket generated by
   code(socketpair()) per default. (link(example)(EXAMPLE_ADDRESS_EXEC)) nl()  
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(EXEC)(GROUP_EXEC),link(FORK)(GROUP_FORK),link(TERMIOS)(GROUP_TERMIOS) nl()
   Useful options:
   link(path)(OPTION_PATH),
   link(fdin)(OPTION_FDIN),
   link(fdout)(OPTION_FDOUT),
   link(chroot)(OPTION_CHROOT),
   link(su)(OPTION_SUBSTUSER),
   link(su-d)(OPTION_SUBSTUSER_DELAYED),
   link(nofork)(OPTION_NOFORK),
   link(socktype)(OPTION_SO_TYPE),
   link(pty)(OPTION_PTY),
   link(stderr)(OPTION_STDERR),
   link(ctty)(OPTION_CTTY),
   link(setsid)(OPTION_SETSID),
   link(pipes)(OPTION_PIPES),
   link(umask)(OPTION_UMASK),
   link(login)(OPTION_LOGIN),
   link(sigint)(OPTION_SIGINT),
   link(sigquit)(OPTION_SIGQUIT),
   link(netns)(OPTION_NETNS)nl()
   See also: link(SYSTEM)(ADDRESS_SYSTEM),link(SHELL)(ADDRESS_SHELL)
label(ADDRESS_FD)dit(bf(tt(FD:<fdnum>)))
   Uses the file descriptor link(<fdnum>)(TYPE_FDNUM). It must already exist as
   valid unix() file descriptor.nl()
   Option groups: link(FD)(GROUP_FD) (link(TERMIOS)(GROUP_TERMIOS),link(REG)(GROUP_REG),link(SOCKET)(GROUP_SOCKET)) nl()
   See also:
   link(STDIO)(ADDRESS_STDIO),
   link(STDIN)(ADDRESS_STDIN),
   link(STDOUT)(ADDRESS_STDOUT),
   link(STDERR)(ADDRESS_STDERR) 
label(ADDRESS_GOPEN)dit(bf(tt(GOPEN:<filename>)))
   (Generic open) This address type tries to handle any file system entry
   except directories usefully. link(<filename>)(TYPE_FILENAME) may be a
   relative or absolute path. If it already exists, its type is checked. 
   In case of a unixdomain() socket, socat() connects; if connecting fails,
   socat() assumes a datagram socket and uses code(sendto()) calls.
   If the entry is not a socket, socat() opens it applying the code(O_APPEND)
   flag. 
   If it does not exist, it is opened with flag
   code(O_CREAT) as a regular file (link(example)(EXAMPLE_ADDRESS_GOPEN)).nl()
   Option groups: link(FD)(GROUP_FD),link(REG)(GROUP_REG),link(SOCKET)(GROUP_SOCKET),link(NAMED)(GROUP_NAMED),link(OPEN)(GROUP_OPEN) nl()
   See also:
   link(OPEN)(ADDRESS_OPEN),
   link(CREATE)(ADDRESS_CREAT),
   link(UNIX-CONNECT)(ADDRESS_UNIX_CONNECT)

label(ADDRESS_IP_SENDTO)dit(bf(tt(IP-SENDTO:<host>:<protocol>)))
   Opens a raw IP socket. Depending on host specification or option link(pf)(OPTION_PROTOCOL_FAMILY), IP protocol version
   4 or 6 is used. It uses link(<protocol>)(TYPE_PROTOCOL) to send packets
   to <host> [link(IP address)(TYPE_IP_ADDRESS)] and receives packets from
   host, ignores packets from other hosts. 
   Protocol 255 uses the raw socket with the IP header being part of the
   data.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6) nl()
   Useful options:
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(ttl)(OPTION_TTL) nl()
   See also:
   link(IP4-SENDTO)(ADDRESS_IP4_SENDTO),
   link(IP6-SENDTO)(ADDRESS_IP6_SENDTO),
   link(IP-RECVFROM)(ADDRESS_IP_RECVFROM),
   link(IP-RECV)(ADDRESS_IP_RECV),
   link(UDP-SENDTO)(ADDRESS_UDP_SENDTO),
   link(UNIX-SENDTO)(ADDRESS_UNIX_SENDTO)
label(ADDRESS_INTERFACE)dit(bf(tt(INTERFACE:<interface>)))
   Communicates with a network connected on an interface using raw packets
   including link level data. link(<interface>)(TYPE_INTERFACE) is the name of
   the network interface. Currently only available on Linux.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET) nl()
   Useful options:
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(type)(OPTION_SO_TYPE)nl()
   See also: link(ip-recv)(ADDRESS_IP_RECV)
label(ADDRESS_IP4_SENDTO)dit(bf(tt(IP4-SENDTO:<host>:<protocol>)))
   Like link(IP-SENDTO)(ADDRESS_IP_SENDTO), but always uses IPv4.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4) nl()
label(ADDRESS_IP6_SENDTO)dit(bf(tt(IP6-SENDTO:<host>:<protocol>)))
   Like link(IP-SENDTO)(ADDRESS_IP_SENDTO), but always uses IPv6.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6) nl()

label(ADDRESS_IP_DATAGRAM)dit(bf(tt(IP-DATAGRAM:<address>:<protocol>)))
   Sends outgoing data to the specified address which may in particular be a
   broadcast or multicast address. Packets arriving on the local socket are
   checked if their source addresses match
   link(RANGE)(OPTION_RANGE) or link(TCPWRAP)(OPTION_TCPWRAPPERS)
   options. This address type can for example be used for implementing
   symmetric or asymmetric broadcast or multicast communications.nl()
   Option groups: link(FD)(GROUP_FD), link(SOCKET)(GROUP_SOCKET),
      link(IP4)(GROUP_IP4), link(IP6)(GROUP_IP6), link(RANGE)(GROUP_RANGE) nl()
   Useful options:
   link(bind)(OPTION_BIND),
   link(range)(OPTION_RANGE),
   link(tcpwrap)(OPTION_TCPWRAPPERS),
   link(broadcast)(OPTION_SO_BROADCAST),
   link(ip-multicast-loop)(OPTION_IP_MULTICAST_LOOP),
   link(ip-multicast-ttl)(OPTION_IP_MULTICAST_TTL),
   link(ip-multicast-if)(OPTION_IP_MULTICAST_IF),
   link(ip-add-membership)(OPTION_IP_ADD_MEMBERSHIP),
   link(ip-add-source-membership)(OPTION_IP_ADD_SOURCE_MEMBERSHIP),
   link(ipv6-join-group)(OPTION_IPV6_JOIN_GROUP),
   link(ipv6-join-source-group)(OPTION_IPV6_JOIN_SOURCE_GROUP),
   link(ttl)(OPTION_TTL),
   link(tos)(OPTION_TOS),
   link(pf)(OPTION_PROTOCOL_FAMILY)nl()
   See also:
   link(IP4-DATAGRAM)(ADDRESS_IP4_DATAGRAM),
   link(IP6-DATAGRAM)(ADDRESS_IP6_DATAGRAM),
   link(IP-SENDTO)(ADDRESS_IP_SENDTO),
   link(IP-RECVFROM)(ADDRESS_IP_RECVFROM),
   link(IP-RECV)(ADDRESS_IP_RECV),
   link(UDP-DATAGRAM)(ADDRESS_UDP_DATAGRAM)
label(ADDRESS_IP4_DATAGRAM)dit(bf(tt(IP4-DATAGRAM:<host>:<protocol>)))
   Like link(IP-DATAGRAM)(ADDRESS_IP_DATAGRAM), but always uses IPv4.
   (link(example)(EXAMPLE_ADDRESS_IP4_BROADCAST_CLIENT))nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(RANGE)(GROUP_RANGE) nl()
label(ADDRESS_IP6_DATAGRAM)dit(bf(tt(IP6-DATAGRAM:<host>:<protocol>)))
   Like link(IP-DATAGRAM)(ADDRESS_IP_DATAGRAM), but always uses IPv6. Please
   note that IPv6 does not know broadcasts.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6),link(RANGE)(GROUP_RANGE) nl()

label(ADDRESS_IP_RECVFROM)dit(bf(tt(IP-RECVFROM:<protocol>)))
   Opens a raw IP socket of link(<protocol>)(TYPE_PROTOCOL). Depending on option link(pf)(OPTION_PROTOCOL_FAMILY), IP protocol version
   4 or 6 is used. It receives one packet from an unspecified peer and may send one or more answer packets to that peer.
   This mode is particularly useful with fork option where each arriving packet - from arbitrary peers - is handled by its own sub process.
   This allows a behaviour similar to typical UDP based servers like ntpd or
   named.nl()
   Please note that the reply packets might be fetched as incoming traffic when
   sender and receiver IP address are identical because there is no port number
   to distinguish the sockets.nl()
   This address works well with IP-SENDTO address peers (see above).
   Protocol 255 uses the raw socket with the IP header being part of the
   data.nl()
   See the link(note about RECVFROM addresses)(NOTE_RECVFROM).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE) nl()
   Useful options:
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(fork)(OPTION_FORK),
   link(range)(OPTION_RANGE),
   link(ttl)(OPTION_TTL),
   link(broadcast)(OPTION_SO_BROADCAST)nl()
   See also:
   link(IP4-RECVFROM)(ADDRESS_IP4_RECVFROM),
   link(IP6-RECVFROM)(ADDRESS_IP6_RECVFROM),
   link(IP-SENDTO)(ADDRESS_IP_SENDTO),
   link(IP-RECV)(ADDRESS_IP_RECV),
   link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM),
   link(UNIX-RECVFROM)(ADDRESS_UNIX_RECVFROM) 
label(ADDRESS_IP4_RECVFROM)dit(bf(tt(IP4-RECVFROM:<protocol>)))
   Like link(IP-RECVFROM)(ADDRESS_IP_RECVFROM), but always uses IPv4.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE) nl()
label(ADDRESS_IP6_RECVFROM)dit(bf(tt(IP6-RECVFROM:<protocol>)))
   Like link(IP-RECVFROM)(ADDRESS_IP_RECVFROM), but always uses IPv6.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE) nl()

label(ADDRESS_IP_RECV)dit(bf(tt(IP-RECV:<protocol>)))
   Opens a raw IP socket of link(<protocol>)(TYPE_PROTOCOL). Depending on option link(pf)(OPTION_PROTOCOL_FAMILY), IP protocol version
   4 or 6 is used. It receives packets from multiple unspecified peers and merges the data.
   No replies are possible, this is a read-only address, see options link(-u)(option_u) and
   link(-U)(option_U), and link(dual addresses)(ADDRESS_DUAL).
   It can be, e.g., addressed by socat IP-SENDTO address peers.
   Protocol 255 uses the raw socket with the IP header being part of the
   data.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(RANGE)(GROUP_RANGE) nl()
   Useful options:
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(range)(OPTION_RANGE)nl()
   See also:
   link(IP4-RECV)(ADDRESS_IP4_RECV),
   link(IP6-RECV)(ADDRESS_IP6_RECV),
   link(IP-SENDTO)(ADDRESS_IP_SENDTO),
   link(IP-RECVFROM)(ADDRESS_IP_RECVFROM),
   link(UDP-RECV)(ADDRESS_UDP_RECV),
   link(UNIX-RECV)(ADDRESS_UNIX_RECV) 
label(ADDRESS_IP4_RECV)dit(bf(tt(IP4-RECV:<protocol>)))
   Like link(IP-RECV)(ADDRESS_IP_RECV), but always uses IPv4.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(RANGE)(GROUP_RANGE) nl()
label(ADDRESS_IP6_RECV)dit(bf(tt(IP6-RECV:<protocol>)))
   Like link(IP-RECV)(ADDRESS_IP_RECV), but always uses IPv6.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6),link(RANGE)(GROUP_RANGE) nl()

label(ADDRESS_OPEN)dit(bf(tt(OPEN:<filename>)))
   Opens link(<filename>)(TYPE_FILENAME) using the code(open()) system call
   (link(example)(EXAMPLE_ADDRESS_OPEN)).
   This operation fails on unixdomain() sockets. nl()
   Note: This address type is rarely useful in bidirectional mode.nl()
   Option groups: link(FD)(GROUP_FD),link(REG)(GROUP_REG),link(NAMED)(GROUP_NAMED),link(OPEN)(GROUP_OPEN) nl()
   Useful options:
   link(creat)(OPTION_O_CREAT),
   link(excl)(OPTION_EXCL),
   link(noatime)(OPTION_O_NOATIME),
   link(nofollow)(OPTION_NOFOLLOW),
   link(append)(OPTION_APPEND),
   link(rdonly)(OPTION_RDONLY),
   link(wronly)(OPTION_WRONLY),
   link(lock)(OPTION_LOCK),
   link(readbytes)(OPTION_READBYTES),
   link(ignoreeof)(OPTION_IGNOREEOF)nl()
   See also:
   link(CREATE)(ADDRESS_CREAT),
   link(GOPEN)(ADDRESS_GOPEN),
   link(UNIX-CONNECT)(ADDRESS_UNIX_CONNECT)

label(ADDRESS_OPENSSL_CONNECT)dit(bf(tt(OPENSSL:<host>:<port>)))
   Tries to establish a SSL connection to <port> [link(TCP
   service)(TYPE_TCP_SERVICE)] on  
   <host> [link(IP address)(TYPE_IP_ADDRESS)] using TCP/IP version 4 or 6
   depending on address specification, name resolution, or option
   link(pf)(OPTION_PROTOCOL_FAMILY).nl()
   NOTE: Up to version 1.7.2.4
   the server certificate was only checked for validity against the system
   certificate store or link(cafile)(OPTION_OPENSSL_CAFILE) or
   link(capath)(OPTION_OPENSSL_CAPATH),
   but not for match with the server's name or its IP address.
   Since version 1.7.3.0 socat checks the peer certificate for match with the
   <host> parameter or the value of the 
   link(openssl-commonname)(OPTION_OPENSSL_COMMONNAME) option.
   Socat tries to match it against the certificates subject commonName,
   and the certificates extension subjectAltName DNS names. Wildcards in the
   certificate are supported.nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(OPENSSL)(GROUP_OPENSSL),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(min-proto-version)(OPTION_OPENSSL_MIN_PROTO_VERSION),
   link(cipher)(OPTION_OPENSSL_CIPHERLIST),
   link(verify)(OPTION_OPENSSL_VERIFY),
   link(commonname)(OPTION_OPENSSL_COMMONNAME),
   link(cafile)(OPTION_OPENSSL_CAFILE),
   link(capath)(OPTION_OPENSSL_CAPATH),
   link(certificate)(OPTION_OPENSSL_CERTIFICATE),
   link(key)(OPTION_OPENSSL_KEY),
   link(compress)(OPTION_OPENSSL_COMPRESS),
   link(bind)(OPTION_BIND),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(connect-timeout)(OPTION_CONNECT_TIMEOUT),
   link(sourceport)(OPTION_SOURCEPORT),
   link(retry)(OPTION_RETRY)nl()
   See also:
   link(OPENSSL-LISTEN)(ADDRESS_OPENSSL_LISTEN),
   link(TCP)(ADDRESS_TCP_CONNECT)

label(ADDRESS_OPENSSL_LISTEN)dit(bf(tt(OPENSSL-LISTEN:<port>)))
   Listens on tcp <port> [link(TCP service)(TYPE_TCP_SERVICE)].
   The IP version is 4 or the one specified with
   link(pf)(OPTION_PROTOCOL_FAMILY). When a
   connection is accepted, this address behaves as SSL server.nl()
   Note: You probably want to use the link(certificate)(OPTION_OPENSSL_CERTIFICATE) option with this address.nl()
   NOTE: The client certificate is only checked for validity against
   link(cafile)(OPTION_OPENSSL_CAFILE) or link(capath)(OPTION_OPENSSL_CAPATH),
   but not for match with the client's name or its IP address!nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(LISTEN)(GROUP_LISTEN),link(OPENSSL)(GROUP_OPENSSL),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(min-proto-version)(OPTION_OPENSSL_MIN_PROTO_VERSION),
   link(cipher)(OPTION_OPENSSL_CIPHERLIST),
   link(verify)(OPTION_OPENSSL_VERIFY),
   link(commonname)(OPTION_OPENSSL_COMMONNAME),
   link(cafile)(OPTION_OPENSSL_CAFILE),
   link(capath)(OPTION_OPENSSL_CAPATH),
   link(certificate)(OPTION_OPENSSL_CERTIFICATE),
   link(key)(OPTION_OPENSSL_KEY),
   link(compress)(OPTION_OPENSSL_COMPRESS),
   link(fork)(OPTION_FORK),
   link(bind)(OPTION_BIND),
   link(range)(OPTION_RANGE),
   link(tcpwrap)(OPTION_TCPWRAPPERS),
   link(su)(OPTION_SUBSTUSER),
   link(reuseaddr)(OPTION_SO_REUSEADDR),
   link(retry)(OPTION_RETRY)nl()
   See also:
   link(OPENSSL)(ADDRESS_OPENSSL_CONNECT),
   link(TCP-LISTEN)(ADDRESS_TCP_LISTEN)

label(ADDRESS_OPENSSL_DTLS_CLIENT)dit(bf(tt(OPENSSL-DTLS-CLIENT:<host>:<port>)))
   Tries to establish a DTLS connection to <port> [link(UDP
   service)(TYPE_UDP_SERVICE)] on
   <host> [link(IP address)(TYPE_IP_ADDRESS)] using UDP/IP version 4 or 6
   depending on address specification, name resolution, or option
   link(pf)(OPTION_PROTOCOL_FAMILY).nl()
   Socat() checks the peer certificates subjectAltName or commonName against the addresses
   option link(openssl-commonname)(OPTION_OPENSSL_COMMONNAME) or the host name.
   Wildcards in the certificate are supported.nl()
   Use socat() option link(-b)(option_b) to make datagrams small enough to fit with overhead
   on the network. Use option link(-T)(option_T) to prevent indefinite hanging when peer went down quietly.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),COMMENT(link(UDP)(GROUP_UDP),)link(OPENSSL)(GROUP_OPENSSL),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(min-proto-version)(OPTION_OPENSSL_MIN_PROTO_VERSION),
   link(cipher)(OPTION_OPENSSL_CIPHERLIST),
   link(verify)(OPTION_OPENSSL_VERIFY),
   link(commonname)(OPTION_OPENSSL_COMMONNAME),
   link(cafile)(OPTION_OPENSSL_CAFILE),
   link(capath)(OPTION_OPENSSL_CAPATH),
   link(certificate)(OPTION_OPENSSL_CERTIFICATE),
   link(key)(OPTION_OPENSSL_KEY),
   link(compress)(OPTION_OPENSSL_COMPRESS),
   link(bind)(OPTION_BIND),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(sourceport)(OPTION_SOURCEPORT),
   link(retry)(OPTION_RETRY),
   link(rcvtimeo)(OPTION_SO_RCVTIMOE)nl()
   See also:
   link(OPENSSL-DTLS-SERVER)(ADDRESS_OPENSSL_DTLS_SERVER),
   link(OPENSSL-CONNECT)(ADDRESS_OPENSSL_CONNECT),
   link(UDP-CONNECT)(ADDRESS_UDP_CONNECT)

label(ADDRESS_OPENSSL_DTLS_SERVER)dit(bf(tt(OPENSSL-DTLS-SERVER:<port>)))
   Listens on UDP <port> [link(UDP service)(TYPE_UDP_SERVICE)].
   The IP version is 4 or the one specified with
   link(pf)(OPTION_PROTOCOL_FAMILY). When a
   connection is accepted, this address behaves as DTLS server.nl()
   Note: You probably want to use the link(certificate)(OPTION_OPENSSL_CERTIFICATE) option with this address.nl()
   NOTE: The client certificate is only checked for validity against
   link(cafile)(OPTION_OPENSSL_CAFILE) or link(capath)(OPTION_OPENSSL_CAPATH),
   but not for match with the client's name or its IP address!
   Use socat() option link(-b)(option_b) to make datagrams small enough to fit with overhead on the network.
   Use option link(-T)(option_T) to prevent indefinite hanging when peer went down quietly.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),COMMENT(link(UDP)(GROUP_UDP),)link(LISTEN)(GROUP_LISTEN),link(OPENSSL)(GROUP_OPENSSL),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(min-proto-version)(OPTION_OPENSSL_MIN_PROTO_VERSION),
   link(cipher)(OPTION_OPENSSL_CIPHERLIST),
   link(verify)(OPTION_OPENSSL_VERIFY),
   link(commonname)(OPTION_OPENSSL_COMMONNAME),
   link(cafile)(OPTION_OPENSSL_CAFILE),
   link(capath)(OPTION_OPENSSL_CAPATH),
   link(certificate)(OPTION_OPENSSL_CERTIFICATE),
   link(key)(OPTION_OPENSSL_KEY),
   link(compress)(OPTION_OPENSSL_COMPRESS),
   link(fork)(OPTION_FORK),
   link(bind)(OPTION_BIND),
   link(range)(OPTION_RANGE),
   link(tcpwrap)(OPTION_TCPWRAPPERS),
   link(su)(OPTION_SUBSTUSER),
   link(reuseaddr)(OPTION_SO_REUSEADDR),
   link(retry)(OPTION_RETRY)nl()
   link(rcvtimeo)(OPTION_SO_RCVTIMOE)nl()
   See also:
   link(OPENSSL-DTLS-CLIENT)(ADDRESS_OPENSSL_DTLS_CLIENT),
   link(OPENSSL-LISTEN)(ADDRESS_OPENSSL_LISTEN),
   link(UDP-LISTEN)(ADDRESS_UDP_LISTEN)

label(ADDRESS_NAMED_PIPE)dit(bf(tt(PIPE:<filename>)))
   If link(<filename>)(TYPE_FILENAME) already exists, it is opened.
   If it does not exist, a named pipe is created and opened. Beginning with
   socat version 1.4.3, the named pipe is removed when the address is closed
   (but see option link(unlink-close)(OPTION_UNLINK_CLOSE)nl()
   Note: When a pipe is used for both reading and writing, it works
   as echo service.nl()
   Note: When a pipe is used for both reading and writing, and socat tries
   to write more bytes than the pipe can buffer (Linux 2.4: 2048 bytes), socat
   might block. Consider using socat option, e.g., code(-b 2048) nl()
   Option groups: link(FD)(GROUP_FD),link(NAMED)(GROUP_NAMED),link(OPEN)(GROUP_OPEN) nl()
   Useful options:
   link(rdonly)(OPTION_RDONLY),
   link(nonblock)(OPTION_NONBLOCK),
   link(group)(OPTION_GROUP),
   link(user)(OPTION_USER),
   link(mode)(OPTION_MODE),
   link(unlink-early)(OPTION_UNLINK_EARLY)nl()
   See also: link(unnamed pipe)(ADDRESS_UNNAMED_PIPE)
label(ADDRESS_UNNAMED_PIPE)dit(bf(tt(PIPE)))
   Creates an unnamed pipe and uses it for reading and writing. It works as an
   echo, because everything written to it appeares immediately as read
   data.nl()
   Note: When socat tries to write more bytes than the pipe can queue (Linux
   2.4: 2048 bytes), socat might block. Consider, e.g., using
   option code(-b 2048) nl()
   Option groups: link(FD)(GROUP_FD) nl()
   See also: link(named pipe)(ADDRESS_NAMED_PIPE), link(SOCKETPAIR)(ADDRESS_SOCKETPAIR)
label(ADDRESS_SOCKETPAIR)dit(bf(tt(SOCKETPAIR)))
   Creates a socketpair and uses it for reading and writing. It works as an
   echo, because everything written to it appeares immediately as read
   data. The default socket type is datagram, so it keeps packet boundaries.
   nl()
   Option groups: link(FD)(GROUP_FD) nl()
   Useful options:
   link(socktype)(OPTION_SO_TYPE)nl()
   See also: link(unnamed pipe)(ADDRESS_UNNAMED_PIPE)

label(ADDRESS_POSIXMQ_READ)dit(bf(tt(POSIXMQ-READ:/<mqueue>)))
   Opens the specified POSIX message queue and reads messages (packets). It
   keeps the boundaries.nl()
   This is a read-only address, see options link(-u)(option_u) and
   link(-U)(option_U) and link(dual addresses)(ADDRESS_DUAL).nl()
   Socat() provides this address type only on Linux because POSIX MQ is based
   on UNIX filedescriptors there.nl()
   This feature is new in version 1.7.5.0 and might change in the future,
   therefore it is link(experimental)(option_experimental).nl()
   Useful options:
   link(posixmq-priority)(OPTION_POSIXMQ_PRIORITY),
   link(unlink-early)(OPTION_UNLINK_EARLY),
   link(unlink-close)(OPTION_UNLINK_CLOSE)

label(ADDRESS_POSIXMQ_RECEIVE)dit(bf(tt(POSIXMQ-RECEIVE:/<mqueue>)))
dit(bf(tt(POSIXMQ-RECV:/<mqueue>)))
   Opens the specified POSIX message queue and reads one message (packet).nl()
   This is a read-only address. See link(POSIXMQ-READ)(ADDRESS_POSIXMQ_READ)
   for more info.nl()
   Example: link(POSIX MQ recv with fork)(EXAMPLE_POSIXMQ_RECV_FORK)nl()
   This feature is link(experimental)(option_experimental).nl()
   Useful options:
   link(posixmq-priority)(OPTION_POSIXMQ_PRIORITY),
   link(fork)(OPTION_FORK),
   link(max-children)(OPTION_MAX_CHILDREN),
   link(unlink-early)(OPTION_UNLINK_EARLY),
   link(unlink-close)(OPTION_UNLINK_CLOSE)

label(ADDRESS_POSIXMQ_SEND)dit(bf(tt(POSIXMQ-SEND:/<mqueue>)))
   Opens the specified POSIX message queue and writes messages (packets).nl()
   This is a write-only address. See link(POSIXMQ-READ)(ADDRESS_POSIXMQ_READ)
   for more info.nl()
   (link(Example)(EXAMPLE_POSIXMQ_SEND))nl()
   This feature is link(experimental)(option_experimental).nl()
   Useful options:
   link(posixmq-priority)(OPTION_POSIXMQ_PRIORITY),
   link(fork)(OPTION_FORK),
   link(max-children)(OPTION_MAX_CHILDREN),
   link(unlink-early)(OPTION_UNLINK_EARLY),
   link(unlink-close)(OPTION_UNLINK_CLOSE)

label(ADDRESS_POSIXMQ_BIDIRECTIONAL)dit(bf(tt(POSIXMQ-BIDIRECTIONAL:/mqueue)))
   Opens the specified POSIX message queue and writes and reads messages
   (packet). This is probably rarely useful but has been implemented for
   functional completeness.

label(ADDRESS_PROXY_CONNECT)dit(bf(tt(PROXY:<proxy>:<hostname>:<port>)))
   Connects to an HTTP proxy server on port 8080 using TCP/IP  version 4 or 6
   depending on address specification, name resolution, or option
   link(pf)(OPTION_PROTOCOL_FAMILY), and sends a CONNECT
   request for hostname:port. If the proxy grants access and succeeds to
   connect to the target, data transfer between socat and the target can
   start (link(example)(EXAMPLE_PROXY_CONNECT)).
   Note that the traffic need not be HTTP but can be an arbitrary protocol. nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(HTTP)(GROUP_HTTP),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(proxyport)(OPTION_PROXYPORT),
   link(ignorecr)(OPTION_IGNORECR),
   link(proxyauth)(OPTION_PROXY_AUTHORIZATION),
   link(resolve)(OPTION_PROXY_RESOLVE),
   link(crnl)(OPTION_CRNL),
   link(bind)(OPTION_BIND),
   link(connect-timeout)(OPTION_CONNECT_TIMEOUT),
   link(mss)(OPTION_MSS),
   link(sourceport)(OPTION_SOURCEPORT),
   link(retry)(OPTION_RETRY) nl()
   See also: link(SOCKS)(ADDRESS_SOCKS4), link(TCP)(ADDRESS_TCP_CONNECT)
label(ADDRESS_PTY)dit(bf(tt(PTY)))
   Generates a pseudo terminal (pty) and uses its master side. Another process
   may open the pty's slave side using it like a serial line or terminal.
   (link(example)(EXAMPLE_ADDRESS_PTY)). If
   both the ptmx and the openpty mechanisms are available, ptmx is used
   (POSIX).nl()
   Option groups: link(FD)(GROUP_FD),link(NAMED)(GROUP_NAMED),link(PTY)(GROUP_PTY),link(TERMIOS)(GROUP_TERMIOS) nl()
   Useful options:
   link(link)(OPTION_SYMBOLIC_LINK),
   link(openpty)(OPTION_OPENPTY),
   link(wait-slave)(OPTION_PTY_WAIT_SLAVE),
   link(mode)(OPTION_MODE),
   link(user)(OPTION_USER),
   link(group)(OPTION_GROUP)nl()
   See also:
   link(UNIX-LISTEN)(ADDRESS_UNIX_LISTEN),
   link(PIPE)(ADDRESS_NAMED_PIPE),
   link(EXEC)(ADDRESS_EXEC), link(SYSTEM)(ADDRESS_SYSTEM), link(SHELL)(ADDRESS_SHELL)
label(ADDRESS_READLINE)dit(bf(tt(READLINE)))
   Uses GNU readline and history on stdio to allow editing and reusing input
   lines (link(example)(EXAMPLE_ADDRESS_READLINE)). This requires the GNU readline and 
   history libraries. Note that stdio should be a (pseudo) terminal device,
   otherwise readline does not seem to work.nl()
   Option groups: link(FD)(GROUP_FD),link(READLINE)(GROUP_READLINE),link(TERMIOS)(GROUP_TERMIOS) nl()
   Useful options:
   link(history)(OPTION_HISTORY),
   link(noecho)(OPTION_NOECHO)nl()
   See also:
   link(STDIO)(ADDRESS_STDIO)
label(ADDRESS_SCTP_CONNECT)dit(bf(tt(SCTP-CONNECT:<host>:<port>)))
   Establishes an SCTP stream connection to the specified <host> [link(IP
   address)(TYPE_IP_ADDRESS)] and <port> [link(TCP service)(TYPE_TCP_SERVICE)]
   using IP version 4 or 6 depending on address specification, name
   resolution, or option link(pf)(OPTION_PROTOCOL_FAMILY).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(SCTP)(GROUP_SCTP),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(bind)(OPTION_BIND),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(connect-timeout)(OPTION_CONNECT_TIMEOUT),
   link(tos)(OPTION_TOS),
   link(mtudiscover)(OPTION_MTUDISCOVER),
   link(sctp-maxseg)(OPTION_SCTP_MAXSEG),
   link(sctp-nodelay)(OPTION_SCTP_NODELAY),
   link(nonblock)(OPTION_NONBLOCK),
   link(sourceport)(OPTION_SOURCEPORT),
   link(retry)(OPTION_RETRY),
   link(readbytes)(OPTION_READBYTES)nl()
   See also:
   link(SCTP4-CONNECT)(ADDRESS_SCTP4_CONNECT),
   link(SCTP6-CONNECT)(ADDRESS_SCTP6_CONNECT),
   link(SCTP-LISTEN)(ADDRESS_SCTP_LISTEN),
   link(TCP-CONNECT)(ADDRESS_TCP_CONNECT)
label(ADDRESS_SCTP4_CONNECT)dit(bf(tt(SCTP4-CONNECT:<host>:<port>)))
   Like link(SCTP-CONNECT)(ADDRESS_SCTP_CONNECT), but only supports IPv4 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(SCTP)(GROUP_SCTP),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY) nl()
label(ADDRESS_SCTP6_CONNECT)dit(bf(tt(SCTP6-CONNECT:<host>:<port>)))
   Like link(SCTP-CONNECT)(ADDRESS_SCTP_CONNECT), but only supports IPv6 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6),link(SCTP)(GROUP_SCTP),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY) nl()
label(ADDRESS_SCTP_LISTEN)dit(bf(tt(SCTP-LISTEN:<port>)))
   Listens on <port> [link(TCP service)(TYPE_TCP_SERVICE)] and accepts an
   SCTP connection. The IP version is 4 or the one specified with
   address option link(pf)(OPTION_PROTOCOL_FAMILY), socat option
   (link(-4)(option_4), link(-6)(option_6)), or environment variable link(SOCAT_DEFAULT_LISTEN_IP)(ENV_SOCAT_DEFAULT_LISTEN_IP).
   Note that opening
   this address usually blocks until a client connects.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(SCTP)(GROUP_SCTP),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(crnl)(OPTION_CRNL),
   link(fork)(OPTION_FORK),
   link(bind)(OPTION_BIND),
   link(range)(OPTION_RANGE),
   link(tcpwrap)(OPTION_TCPWRAPPERS),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(max-children)(OPTION_MAX_CHILDREN),
   link(backlog)(OPTION_BACKLOG),
   link(accept-timeout)(OPTION_ACCEPT_TIMEOUT),
   link(sctp-maxseg)(OPTION_SCTP_MAXSEG),
   link(sctp-nodelay)(OPTION_SCTP_NODELAY),
   link(su)(OPTION_SUBSTUSER),
   link(reuseaddr)(OPTION_SO_REUSEADDR),
   link(retry)(OPTION_RETRY)nl()
   See also:
   link(SCTP4-LISTEN)(ADDRESS_SCTP4_LISTEN),
   link(SCTP6-LISTEN)(ADDRESS_SCTP6_LISTEN),
   link(TCP-LISTEN)(ADDRESS_TCP_LISTEN),
   link(SCTP-CONNECT)(ADDRESS_SCTP_CONNECT)
label(ADDRESS_SCTP4_LISTEN)dit(bf(tt(SCTP4-LISTEN:<port>)))
   Like link(SCTP-LISTEN)(ADDRESS_SCTP_LISTEN), but only supports IPv4
   protocol.nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP4)(GROUP_IP4),link(SCTP)(GROUP_SCTP),link(RETRY)(GROUP_RETRY) nl()
label(ADDRESS_SCTP6_LISTEN)dit(bf(tt(SCTP6-LISTEN:<port>)))
   Like link(SCTP-LISTEN)(ADDRESS_SCTP_LISTEN), but only supports IPv6
   protocol.nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP6)(GROUP_IP6),link(SCTP)(GROUP_SCTP),link(RETRY)(GROUP_RETRY) nl()
label(ADDRESS_SOCKET_CONNECT)dit(bf(tt(SOCKET-CONNECT:<domain>:<protocol>:<remote-address>)))
   Creates a stream socket using the first and second given socket parameters
   and tt(SOCK_STREAM) (see man NOEXPAND(socket(2))) and connects to the remote-address.
   The two socket parameters have to be specified by link(int)(TYPE_INT)
   numbers. Consult your OS documentation and include files to find the
   appropriate values. The remote-address must be the link(data)(TYPE_DATA)
   representation of a sockaddr structure without sa_family and (BSD) sa_len
   components.nl()
   Please note that you can - beyond the options of the specified groups - also
   use options of higher level protocols when you apply socat option
   link(-g)(option_g).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY)nl()
   Useful options:
   link(bind)(OPTION_BIND),
   link(setsockopt)(OPTION_SETSOCKOPT),
   nl()
   See also:
   link(TCP)(ADDRESS_TCP_CONNECT),
   link(UDP-CONNECT)(ADDRESS_UDP_CONNECT),
   link(UNIX-CONNECT)(ADDRESS_UNIX_CONNECT),
   link(SOCKET-LISTEN)(ADDRESS_SOCKET_LISTEN),
   link(SOCKET-SENDTO)(ADDRESS_SOCKET_SENDTO)
label(ADDRESS_SOCKET_DATAGRAM)dit(bf(tt(SOCKET-DATAGRAM:<domain>:<type>:<protocol>:<remote-address>)))
   Creates a datagram socket using the first three given socket parameters (see
   man NOEXPAND(socket(2))) and sends outgoing data to the remote-address. The three
   socket parameters have to be specified by link(int)(TYPE_INT)
   numbers. Consult your OS documentation and include files to find the
   appropriate values. The remote-address must be the link(data)(TYPE_DATA)
   representation of a sockaddr structure without sa_family and (BSD) sa_len
   components.nl()
   Please note that you can - beyond the options of the specified groups - also
   use options of higher level protocols when you apply socat option
   link(-g)(option_g).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(RANGE)(GROUP_RANGE)nl()
   Useful options:
   link(bind)(OPTION_BIND),
   link(range)(OPTION_RANGE),
   link(setsockopt)(OPTION_SETSOCKOPT),
   nl()
   See also:
   link(UDP-DATAGRAM)(ADDRESS_UDP_DATAGRAM),
   link(IP-DATAGRAM)(ADDRESS_IP_DATAGRAM),
   link(SOCKET-SENDTO)(ADDRESS_SOCKET_SENDTO),
   link(SOCKET-RECV)(ADDRESS_SOCKET_RECV),
   link(SOCKET-RECVFROM)(ADDRESS_SOCKET_RECVFROM)
label(ADDRESS_SOCKET_LISTEN)dit(bf(tt(SOCKET-LISTEN:<domain>:<protocol>:<local-address>)))
   Creates a stream socket using the first and second given socket parameters
   and tt(SOCK_STREAM) (see man NOEXPAND(socket(2))) and waits for incoming connections
   on local-address. The two socket parameters have to be specified by
   link(int)(TYPE_INT) numbers. Consult your OS documentation and include files
   to find the appropriate values. The local-address must be the
   link(data)(TYPE_DATA) representation of a sockaddr structure without
   sa_family and (BSD) sa_len components.nl()
   Please note that you can - beyond the options of the specified groups - also
   use options of higher level protocols when you apply socat option
   link(-g)(option_g).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(RANGE)(GROUP_RANGE),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY)nl()
   Useful options:
   link(setsockopt)(OPTION_SETSOCKOPT),
   link(setsockopt-listen)(OPTION_SETSOCKOPT_LISTEN),
   nl()
   See also:
   link(TCP)(ADDRESS_TCP_LISTEN),
   link(UDP-CONNECT)(ADDRESS_UDP_LISTEN),
   link(UNIX-CONNECT)(ADDRESS_UNIX_LISTEN),
   link(SOCKET-LISTEN)(ADDRESS_SOCKET_CONNECT),
   link(SOCKET-SENDTO)(ADDRESS_SOCKET_RECVFROM),
   link(SOCKET-SENDTO)(ADDRESS_SOCKET_RECV)
label(ADDRESS_SOCKET_RECV)dit(bf(tt(SOCKET-RECV:<domain>:<type>:<protocol>:<local-address>)))
   Creates a socket using the three given socket parameters (see man NOEXPAND(socket(2)))
   and binds it to <local-address>. Receives arriving data. The three
   parameters have to be specified by link(int)(TYPE_INT) numbers. Consult your
   OS documentation and include files to find the appropriate values. The
   local-address must be the link(data)(TYPE_DATA) representation of a sockaddr
   structure without sa_family and (BSD) sa_len components.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(RANGE)(GROUP_RANGE)nl()
   Useful options:
   link(range)(OPTION_RANGE),
   link(setsockopt)(OPTION_SETSOCKOPT),
   link(setsockopt-listen)(OPTION_SETSOCKOPT_LISTEN)
   nl()
   See also:
   link(UDP-RECV)(ADDRESS_UDP_RECV),
   link(IP-RECV)(ADDRESS_IP_RECV),
   link(UNIX-RECV)(ADDRESS_UNIX_RECV),
   link(SOCKET-DATAGRAM)(ADDRESS_SOCKET_DATAGRAM),
   link(SOCKET-SENDTO)(ADDRESS_SOCKET_SENDTO),
   link(SOCKET-RECVFROM)(ADDRESS_SOCKET_RECVFROM)
label(ADDRESS_SOCKET_RECVFROM)dit(bf(tt(SOCKET-RECVFROM:<domain>:<type>:<protocol>:<local-address>)))
   Creates a socket using the three given socket parameters (see man NOEXPAND(socket(2)))
   and binds it to <local-address>. Receives arriving data and sends replies
   back to the sender. The first three parameters have to be specified as
   link(int)(TYPE_INT) numbers. Consult your OS documentation and include files
   to find the appropriate values. The local-address must be the
   link(data)(TYPE_DATA) representation of a sockaddr structure without
   sa_family and (BSD) sa_len components.nl()
   See the link(note about RECVFROM addresses)(NOTE_RECVFROM).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE)nl()
   Useful options:
   link(fork)(OPTION_FORK),
   link(range)(OPTION_RANGE),
   link(setsockopt)(OPTION_SETSOCKOPT),
   link(setsockopt-listen)(OPTION_SETSOCKOPT_LISTEN)
   nl()
   See also:
   link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM),
   link(IP-RECVFROM)(ADDRESS_IP_RECVFROM),
   link(UNIX-RECVFROM)(ADDRESS_UNIX_RECVFROM),
   link(SOCKET-DATAGRAM)(ADDRESS_SOCKET_DATAGRAM),
   link(SOCKET-SENDTO)(ADDRESS_SOCKET_SENDTO),
   link(SOCKET-RECV)(ADDRESS_SOCKET_RECV)
label(ADDRESS_SOCKET_SENDTO)dit(bf(tt(SOCKET-SENDTO:<domain>:<type>:<protocol>:<remote-address>)))
   Creates a socket using the three given socket parameters (see man
   NOEXPAND(socket(2))). Sends outgoing data to the given address and receives replies.
   The three parameters have to be specified as link(int)(TYPE_INT)
   numbers. Consult your OS documentation and include files to find the
   appropriate values. The remote-address must be the link(data)(TYPE_DATA)
   representation of a sockaddr structure without sa_family and (BSD) sa_len
   components.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET)nl()
   Useful options:
   link(bind)(OPTION_BIND),
   link(setsockopt)(OPTION_SETSOCKOPT),
   link(setsockopt-listen)(OPTION_SETSOCKOPT_LISTEN)
   nl()
   See also:
   link(UDP-SENDTO)(ADDRESS_UDP_SENDTO),
   link(IP-SENDTO)(ADDRESS_IP_SENDTO),
   link(UNIX-SENDTO)(ADDRESS_UNIX_SENDTO),
   link(SOCKET-DATAGRAM)(ADDRESS_SOCKET_DATAGRAM),
   link(SOCKET-RECV)(ADDRESS_SOCKET_RECV)
   link(SOCKET-RECVFROM)(ADDRESS_SOCKET_RECVFROM)
label(ADDRESS_ACCEPT_FD)dit(bf(tt(ACCEPT-FD:<fdnum>)))
   Expects a listening socket in <fdnum> and accepts one or (with option
   link(fork)(OPTION_FORK)) more connections. This address type is useful under
   systemd control with "inetd mode".nl()
   Example: (link(example)(EXAMPLE_ADDRESS_ACCEPT_FD))
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET)link(TCP)(GROUP_TCP),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(fork)(OPTION_FORK)),
   link(range)(OPTION_RANGE),
   link(sourceport)(OPTION_SOURCEPORT),
   link(lowport)(OPTION_LOWPORT),
   link(tcpwrap)(OPTION_TCPWRAPPERS),
label(ADDRESS_SOCKS4)dit(bf(tt(SOCKS4:<socks-server>:<host>:<port>)))
   Connects via <socks-server> [link(IP address)(TYPE_IP_ADDRESS)]
   to <host> [link(IPv4 address)(TYPE_IPV4_ADDRESS)]
   on <port> [link(TCP service)(TYPE_TCP_SERVICE)],
   using socks version 4 protocol over IP version 4 or 6 depending on address specification, name resolution, or option
   link(pf)(OPTION_PROTOCOL_FAMILY) (link(example)(EXAMPLE_ADDRESS_SOCKS4)).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(SOCKS4)(GROUP_SOCKS),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(socksuser)(OPTION_SOCKSUSER),
   link(socksport)(OPTION_SOCKSPORT),
   link(sourceport)(OPTION_SOURCEPORT),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(retry)(OPTION_RETRY)nl()
   See also:
   link(SOCKS5)(ADDRESS_SOCKS5_CONNECT),
   link(SOCKS4A)(ADDRESS_SOCKS4A),
   link(PROXY)(ADDRESS_PROXY_CONNECT),
   link(TCP)(ADDRESS_TCP_CONNECT)

label(ADDRESS_SOCKS4A)dit(bf(tt(SOCKS4A:<socks-server>:<host>:<port>)))
   like link(SOCKS4)(ADDRESS_SOCKS4), but uses socks protocol version 4a, thus
   leaving host name resolution to the socks server.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(SOCKS4)(GROUP_SOCKS),link(RETRY)(GROUP_RETRY) nl()

label(ADDRESS_SOCKS5_CONNECT)dit(bf(tt(SOCKS5-CONNECT:<socks-server>:<socks-port>:<target-host>:<target-port>)))
   Connects via <socks-server> [link(IP address)(TYPE_IP_ADDRESS)]
   to <target-host> [link(IPv4 address)(TYPE_IPV4_ADDRESS)]
   on <target-port> [link(TCP service)(TYPE_TCP_SERVICE)],
   using socks version 5 protocol over TCP. Currently no authentication mechanism is provided.nl()
   This address type is experimental.nl()
   Option groups: link(FD)(GROUP_FD), link(SOCKET)(GROUP_SOCKET), link(IP4)(GROUP_IP4), link(IP6)(GROUP_IP6), link(TCP)(GROUP_TCP), link(CHILD)(GROUP_CHILD), link(RETRY)(GROUP_RETRY)nl()
   Useful options:
   link(sourceport)(OPTION_SOURCEPORT),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(retry)(OPTION_RETRY)nl()
   See also:
   link(SOCKS5-LISTEN)(ADDRESS_SOCKS5_LISTEN),
   link(SOCKS4)(ADDRESS_SOCKS4),
   link(SOCKS4A)(ADDRESS_SOCKS4A),
   link(PROXY)(ADDRESS_PROXY_CONNECT),
   link(TCP)(ADDRESS_TCP_CONNECT)

label(ADDRESS_SOCKS5_LISTEN)dit(bf(tt(SOCKS5-LISTEN:<socks-server>:<socks-port>:<listen-host>:<listen-port>)))
   Connects to <socks-server> [link(IP address)(TYPE_IP_ADDRESS)]
   using socks version 5 protocol over TCP
   and makes it listen for incoming connections on <listen-port> [link(TCP service)(TYPE_TCP_SERVICE)], binding to <-listen-host> [link(IPv4 address)(TYPE_IPV4_ADDRESS)]
   Currently not authentication mechanism is provided. This address type is experimental.
   Option groups: link(FD)(GROUP_FD), link(SOCKET)(GROUP_SOCKET), link(IP4)(GROUP_IP4), link(IP6)(GROUP_IP6), link(TCP)(GROUP_TCP), link(CHILD)(GROUP_CHILD), link(RETRY)(GROUP_RETRY)nl()
   Useful options:
   link(sourceport)(OPTION_SOURCEPORT),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(retry)(OPTION_RETRY)nl()
   See also:
   link(SOCKS5-CONNECT)(ADDRESS_SOCKS5_CONNECT),

label(ADDRESS_STDERR)dit(bf(tt(STDERR)))
   Uses file descriptor 2.nl()
   This is a write-only address, see options link(-u)(option_u) and
   link(-U)(option_U), and link(dual addresses)(ADDRESS_DUAL).nl()
   Option groups: link(FD)(GROUP_FD) (link(TERMIOS)(GROUP_TERMIOS),link(REG)(GROUP_REG),link(SOCKET)(GROUP_SOCKET)) nl()
   See also: link(FD)(ADDRESS_FD)
label(ADDRESS_STDIN)dit(bf(tt(STDIN)))
   Uses file descriptor 0.nl()
   This is a read-only address, see options link(-u)(option_u) and
   link(-U)(option_U), and link(dual addresses)(ADDRESS_DUAL).nl()
   Option groups: link(FD)(GROUP_FD) (link(TERMIOS)(GROUP_TERMIOS),link(REG)(GROUP_REG),link(SOCKET)(GROUP_SOCKET)) nl()
   Useful options:
   link(readbytes)(OPTION_READBYTES)nl()
   See also: link(FD)(ADDRESS_FD)
label(ADDRESS_STDIO)dit(bf(tt(STDIO)))
   Uses file descriptor 0 for reading, and 1 for writing.nl()
   Option groups: link(FD)(GROUP_FD) (link(TERMIOS)(GROUP_TERMIOS),link(REG)(GROUP_REG),link(SOCKET)(GROUP_SOCKET)) nl()
   Useful options:
   link(readbytes)(OPTION_READBYTES)nl()
   See also: link(FD)(ADDRESS_FD)
label(ADDRESS_STDOUT)dit(bf(tt(STDOUT)))
   Uses file descriptor 1.nl()
   This is a write-only address, see options link(-u)(option_u) and
   link(-U)(option_U), and link(dual addresses)(ADDRESS_DUAL).nl()
   Option groups: link(FD)(GROUP_FD) (link(TERMIOS)(GROUP_TERMIOS),link(REG)(GROUP_REG),link(SOCKET)(GROUP_SOCKET)) nl()
   See also: link(FD)(ADDRESS_FD)
label(ADDRESS_SHELL)dit(bf(tt(SHELL:<shell-command>)))
   Forks a sub process that establishes communication with its parent process
   and invokes the specified program with the configured shell ($SHELL).
   Note that <shell-command> [link(string)(TYPE_STRING)] must
   not contain ',' or "!!", and that shell meta characters may have to be
   protected.
   After successful program start, socat() writes data to stdin of the 
   process and reads from its stdout.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(EXEC)(GROUP_EXEC),link(FORK)(GROUP_FORK),link(TERMIOS)(GROUP_TERMIOS) nl()
   Useful options:
   link(path)(OPTION_PATH),
   link(fdin)(OPTION_FDIN),
   link(fdout)(OPTION_FDOUT),
   link(chroot)(OPTION_CHROOT),
   link(su)(OPTION_SUBSTUSER),
   link(su-d)(OPTION_SUBSTUSER_DELAYED),
   link(nofork)(OPTION_NOFORK),
   link(socktype)(OPTION_SO_TYPE),
   link(pty)(OPTION_PTY),
   link(stderr)(OPTION_STDERR),
   link(ctty)(OPTION_CTTY),
   link(setsid)(OPTION_SETSID),
   link(pipes)(OPTION_PIPES),
   link(umask)(OPTION_UMASK),
   link(sigint)(OPTION_SIGINT),
   link(sigquit)(OPTION_SIGQUIT)nl()
   See also: link(EXEC)(ADDRESS_EXEC), link(SYSTEM)(ADDRESS_SYSTEM)
label(ADDRESS_SYSTEM)dit(bf(tt(SYSTEM:<shell-command>)))
   Forks a sub process that establishes communication with its parent process
   and invokes the specified program with code(system()). Please note that
   <shell-command> [link(string)(TYPE_STRING)] must 
   not contain ',' or "!!", and that shell meta characters may have to be
   protected.
   After successful program start, socat() writes data to stdin of the 
   process and reads from its stdout.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(EXEC)(GROUP_EXEC),link(FORK)(GROUP_FORK),link(TERMIOS)(GROUP_TERMIOS) nl()
   Useful options:
   link(path)(OPTION_PATH),
   link(fdin)(OPTION_FDIN),
   link(fdout)(OPTION_FDOUT),
   link(chroot)(OPTION_CHROOT),
   link(su)(OPTION_SUBSTUSER),
   link(su-d)(OPTION_SUBSTUSER_DELAYED),
   link(nofork)(OPTION_NOFORK),
   link(socktype)(OPTION_SO_TYPE),
   link(pty)(OPTION_PTY),
   link(stderr)(OPTION_STDERR),
   link(ctty)(OPTION_CTTY),
   link(setsid)(OPTION_SETSID),
   link(pipes)(OPTION_PIPES),
   link(umask)(OPTION_UMASK),
   link(sigint)(OPTION_SIGINT),
   link(sigquit)(OPTION_SIGQUIT),
   link(netns)(OPTION_NETNS)nl()
   See also: link(EXEC)(ADDRESS_EXEC), link(SHELL)(ADDRESS_SHELL)
label(ADDRESS_TCP_CONNECT)dit(bf(tt(TCP:<host>:<port>)))
   Connects to <port> [link(TCP service)(TYPE_TCP_SERVICE)] on
   <host> [link(IP address)(TYPE_IP_ADDRESS)] using TCP/IP version 4 or 6
   depending on address specification, name resolution, or option
   link(pf)(OPTION_PROTOCOL_FAMILY).nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(connect-timeout)(OPTION_CONNECT_TIMEOUT),
   link(retry)(OPTION_RETRY),
   link(sourceport)(OPTION_SOURCEPORT),
   link(netns)(OPTION_NETNS),
   link(crnl)(OPTION_CRNL),
   link(bind)(OPTION_BIND),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(tos)(OPTION_TOS),
   link(mtudiscover)(OPTION_MTUDISCOVER),
   link(mss)(OPTION_MSS),
   link(nodelay)(OPTION_TCP_NODELAY),
   link(nonblock)(OPTION_NONBLOCK),
   link(readbytes)(OPTION_READBYTES)nl()
   See also:
   link(TCP4)(ADDRESS_TCP4_CONNECT),
   link(TCP6)(ADDRESS_TCP6_CONNECT),
   link(TCP-LISTEN)(ADDRESS_TCP_LISTEN),
   link(UDP)(ADDRESS_UDP_CONNECT),
   link(SCTP-CONNECT)(ADDRESS_SCTP_CONNECT),
   link(UNIX-CONNECT)(ADDRESS_UNIX_CONNECT)
label(ADDRESS_TCP4_CONNECT)dit(bf(tt(TCP4:<host>:<port>)))
   Like link(TCP)(ADDRESS_TCP_CONNECT), but only supports IPv4 protocol (link(example)(EXAMPLE_ADDRESS_TCP4_CONNECT)).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(TCP)(GROUP_TCP),link(RETRY)(GROUP_RETRY) nl()
label(ADDRESS_TCP6_CONNECT)dit(bf(tt(TCP6:<host>:<port>)))
   Like link(TCP)(ADDRESS_TCP_CONNECT), but only supports IPv6 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(RETRY)(GROUP_RETRY) nl()
label(ADDRESS_TCP_LISTEN)dit(bf(tt(TCP-LISTEN:<port>)))
   Listens on <port> [link(TCP service)(TYPE_TCP_SERVICE)] and accepts a
   TCP/IP connection. The IP version is 4 or the one specified with
   address option link(pf)(OPTION_PROTOCOL_FAMILY), socat option
   (link(-4)(option_4), link(-6)(option_6)), or environment variable link(SOCAT_DEFAULT_LISTEN_IP)(ENV_SOCAT_DEFAULT_LISTEN_IP).
   Note that opening
   this address usually blocks until a client connects.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(crnl)(OPTION_CRNL),
   link(fork)(OPTION_FORK),
   link(bind)(OPTION_BIND),
   link(range)(OPTION_RANGE),
   link(tcpwrap)(OPTION_TCPWRAPPERS),
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(max-children)(OPTION_MAX_CHILDREN),
   link(backlog)(OPTION_BACKLOG),
   link(accept-timeout)(OPTION_ACCEPT_TIMEOUT),
   link(mss)(OPTION_MSS),
   link(su)(OPTION_SUBSTUSER),
   link(reuseaddr)(OPTION_SO_REUSEADDR),
   link(retry)(OPTION_RETRY),
   link(cool-write)(OPTION_COOL_WRITE)nl()
   See also:
   link(TCP4-LISTEN)(ADDRESS_TCP4_LISTEN),
   link(TCP6-LISTEN)(ADDRESS_TCP6_LISTEN),
   link(UDP-LISTEN)(ADDRESS_UDP_LISTEN),
   link(SCTP-LISTEN)(ADDRESS_SCTP_LISTEN),
   link(UNIX-LISTEN)(ADDRESS_UNIX_LISTEN),
   link(OPENSSL-LISTEN)(ADDRESS_OPENSSL_LISTEN),
   link(TCP-CONNECT)(ADDRESS_TCP_CONNECT)
label(ADDRESS_TCP4_LISTEN)dit(bf(tt(TCP4-LISTEN:<port>)))
   Like link(TCP-LISTEN)(ADDRESS_TCP_LISTEN), but only supports IPv4
   protocol (link(example)(EXAMPLE_ADDRESS_TCP4_LISTEN)).nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP4)(GROUP_IP4),link(TCP)(GROUP_TCP),link(RETRY)(GROUP_RETRY) nl()
label(ADDRESS_TCP6_LISTEN)dit(bf(tt(TCP6-LISTEN:<port>)))
   Like link(TCP-LISTEN)(ADDRESS_TCP_LISTEN), but only supports IPv6
   protocol.nl()
   Additional useful option:
   link(ipv6only)(OPTION_IPV6_V6ONLY)nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP6)(GROUP_IP6),link(TCP)(GROUP_TCP),link(RETRY)(GROUP_RETRY) nl()
label(ADDRESS_TUN)dit(bf(tt(TUN[:<if-addr>/<bits>])))
   Creates a Linux TUN/TAP device and optionally assignes it the address and
   netmask given by the parameters. The resulting network interface is almost
   ready for use by other processes; socat serves its "wire side". This address
   requires read and write access to the tunnel cloning device, usually
   code(/dev/net/tun), as well as permission to set some tt(ioctl()s).
   bf(Option iff-up is required to immediately activate the interface!)nl()
   Note: If you intend to transfer packets between two Socat "wire sides" you
   need a protocol that keeps packet boundaries, e.g.UDP; TCP might work with
   option link(nodelay)(OPTION_TCP_NODELAY).nl()
   Option groups: link(FD)(GROUP_FD),link(NAMED)(GROUP_NAMED),link(OPEN)(GROUP_OPEN),link(TUN)(GROUP_INTERFACE) nl()
   Useful options:
   link(iff-up)(OPTION_IFF_UP),
   link(tun-device)(OPTION_TUN_DEVICE),
   link(tun-name)(OPTION_TUN_NAME),
   link(tun-type)(OPTION_TUN_TYPE),
   link(iff-no-pi)(OPTION_IFF_NO_PI),
   link(netns)(OPTION_NETNS)nl()
   See also:
   link(ip-recv)(ADDRESS_IP_RECV)
label(ADDRESS_UDP_CONNECT)dit(bf(tt(UDP:<host>:<port>)))
   Connects to <port> [link(UDP service)(TYPE_UDP_SERVICE)] on
   <host> [link(IP address)(TYPE_IP_ADDRESS)] using UDP/IP version 4 or 6
   depending on address specification, name resolution, or option
   link(pf)(OPTION_PROTOCOL_FAMILY).nl()
   Please note that,
   due to UDP protocol properties, no real connection is established; data has
   to be sent for `connecting' to the server, and no end-of-file condition can
   be transported.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6) nl()
   Useful options:
   link(ttl)(OPTION_TTL),
   link(tos)(OPTION_TOS),
   link(bind)(OPTION_BIND),
   link(sourceport)(OPTION_SOURCEPORT),
   link(pf)(OPTION_PROTOCOL_FAMILY)nl()
   See also:
   link(UDP4)(ADDRESS_UDP4_CONNECT),
   link(UDP6)(ADDRESS_UDP6_CONNECT),
   link(UDP-LISTEN)(ADDRESS_UDP_LISTEN),
   link(TCP)(ADDRESS_TCP_CONNECT),
   link(IP)(ADDRESS_IP_SENDTO)
label(ADDRESS_UDP4_CONNECT)dit(bf(tt(UDP4:<host>:<port>)))
   Like link(UDP)(ADDRESS_UDP_CONNECT), but only supports IPv4 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4) nl()
label(ADDRESS_UDP6_CONNECT)dit(bf(tt(UDP6:<host>:<port>)))
   Like link(UDP)(ADDRESS_UDP_CONNECT), but only supports IPv6 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6) nl()
label(ADDRESS_UDP_DATAGRAM)dit(bf(tt(UDP-DATAGRAM:<address>:<port>)))
   Sends outgoing data to the specified address which may in particular be a
   broadcast or multicast address. Packets arriving on the local socket are
   checked for the correct remote port only when option link(sourceport)(OPTION_SOURCEPORT) is used (this is a change with Socat() version 1.7.4.0) and if their source addresses match
   link(RANGE)(OPTION_RANGE) or link(TCPWRAP)(OPTION_TCPWRAPPERS)
   options. This address type can for example be used for implementing
   symmetric or asymmetric broadcast or multicast communications.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(RANGE)(GROUP_RANGE) nl()
   Useful options:
   link(bind)(OPTION_BIND),
   link(range)(OPTION_RANGE),
   link(tcpwrap)(OPTION_TCPWRAPPERS),
   link(broadcast)(OPTION_SO_BROADCAST),
   link(ip-multicast-loop)(OPTION_IP_MULTICAST_LOOP),
   link(ip-multicast-ttl)(OPTION_IP_MULTICAST_TTL),
   link(ip-multicast-if)(OPTION_IP_MULTICAST_IF),
   link(ip-add-membership)(OPTION_IP_ADD_MEMBERSHIP),
   link(ip-add-source-membership)(OPTION_IP_ADD_SOURCE_MEMBERSHIP),
   link(ipv6-join-group)(OPTION_IPV6_JOIN_GROUP),
   link(ipv6-join-source-group)(OPTION_IPV6_JOIN_SOURCE_GROUP),
   link(ttl)(OPTION_TTL),
   link(tos)(OPTION_TOS),
   link(sourceport)(OPTION_SOURCEPORT),
   link(pf)(OPTION_PROTOCOL_FAMILY)nl()
   See also:
   link(UDP4-DATAGRAM)(ADDRESS_UDP4_DATAGRAM),
   link(UDP6-DATAGRAM)(ADDRESS_UDP6_DATAGRAM),
   link(UDP-SENDTO)(ADDRESS_UDP_SENDTO),
   link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM),
   link(UDP-RECV)(ADDRESS_UDP_RECV),
   link(UDP-CONNECT)(ADDRESS_UDP_CONNECT),
   link(UDP-LISTEN)(ADDRESS_UDP_LISTEN),
   link(IP-DATAGRAM)(ADDRESS_IP_DATAGRAM)
label(ADDRESS_UDP4_DATAGRAM)dit(bf(tt(UDP4-DATAGRAM:<address>:<port>)))
   Like link(UDP-DATAGRAM)(ADDRESS_UDP_DATAGRAM), but only supports IPv4
   protocol (link(example1)(EXAMPLE_ADDRESS_UDP4_BROADCAST_CLIENT),
   link(example2)(EXAMPLE_ADDRESS_UDP4_MULTICAST)).nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4), link(RANGE)(GROUP_RANGE)
label(ADDRESS_UDP6_DATAGRAM)dit(bf(tt(UDP6-DATAGRAM:<address>:<port>)))
   Like link(UDP-DATAGRAM)(ADDRESS_UDP_DATAGRAM), but only supports IPv6
   protocol.nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6),link(RANGE)(GROUP_RANGE)
label(ADDRESS_UDP_LISTEN)dit(bf(tt(UDP-LISTEN:<port>)))
   Waits for a UDP/IP packet arriving on <port>
   [link(UDP service)(TYPE_UDP_SERVICE)] and `connects' back to sender.
   The accepted IP version is 4 or the one specified with option
   link(pf)(OPTION_PROTOCOL_FAMILY).
   Please note that,
   due to UDP protocol properties, no real connection is established; data has
   to arrive from the peer first, and no end-of-file condition can be
   transported. Note that opening  
   this address usually blocks until a client connects.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6) nl()
   Useful options:
   link(fork)(OPTION_FORK),
   link(bind)(OPTION_BIND),
   link(range)(OPTION_RANGE),
   link(pf)(OPTION_PROTOCOL_FAMILY) nl()
   See also:
   link(UDP)(ADDRESS_UDP_CONNECT),
   link(UDP4-LISTEN)(ADDRESS_UDP4_LISTEN),
   link(UDP6-LISTEN)(ADDRESS_UDP6_LISTEN),
   link(TCP-LISTEN)(ADDRESS_TCP_LISTEN)
label(ADDRESS_UDP4_LISTEN)dit(bf(tt(UDP4-LISTEN:<port>)))
   Like link(UDP-LISTEN)(ADDRESS_UDP_LISTEN), but only support IPv4
   protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP4)(GROUP_IP4) nl()
label(ADDRESS_UDP6_LISTEN)dit(bf(tt(UDP6-LISTEN:<port>)))
   Like link(UDP-LISTEN)(ADDRESS_UDP_LISTEN), but only support IPv6
   protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE),link(IP6)(GROUP_IP6) nl()
label(ADDRESS_UDP_SENDTO)dit(bf(tt(UDP-SENDTO:<host>:<port>)))
   Communicates with the specified peer socket, defined by <port> [link(UDP
   service)(TYPE_UDP_SERVICE)] on
   <host> [link(IP address)(TYPE_IP_ADDRESS)], using UDP/IP version 4 or 6
   depending on address specification, name resolution, or option
   link(pf)(OPTION_PROTOCOL_FAMILY). It sends packets to and receives packets
   from that peer socket only.  
   This address effectively implements a datagram client.
   It works well with socat UDP-RECVFROM and UDP-RECV address peers.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6) nl()
   Useful options:
   link(ttl)(OPTION_TTL),
   link(tos)(OPTION_TOS),
   link(bind)(OPTION_BIND),
   link(sourceport)(OPTION_SOURCEPORT),
   link(pf)(OPTION_PROTOCOL_FAMILY)nl()
   See also:
   link(UDP4-SENDTO)(ADDRESS_UDP4_SENDTO),
   link(UDP6-SENDTO)(ADDRESS_UDP6_SENDTO),
   link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM),
   link(UDP-RECV)(ADDRESS_UDP_RECV),
   link(UDP-CONNECT)(ADDRESS_UDP_CONNECT),
   link(UDP-LISTEN)(ADDRESS_UDP_LISTEN),
   link(IP-SENDTO)(ADDRESS_IP_SENDTO)
label(ADDRESS_UDP4_SENDTO)dit(bf(tt(UDP4-SENDTO:<host>:<port>)))
   Like link(UDP-SENDTO)(ADDRESS_UDP_SENDTO), but only supports IPv4
   protocol.nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4)
label(ADDRESS_UDP6_SENDTO)dit(bf(tt(UDP6-SENDTO:<host>:<port>)))
   Like link(UDP-SENDTO)(ADDRESS_UDP_SENDTO), but only supports IPv6
   protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6)

label(ADDRESS_UDP_RECVFROM)dit(bf(tt(UDP-RECVFROM:<port>)))
   Creates a UDP socket on <port> [link(UDP service)(TYPE_UDP_SERVICE)] using
   UDP/IP version 4 or 6 
   depending on option link(pf)(OPTION_PROTOCOL_FAMILY).
   It receives one packet from an unspecified peer and may send one or more
   answer packets to that peer. This mode is particularly useful with
   link(fork)(OPTION_FORK) option 
   where each arriving packet - from arbitrary peers - is handled by its own sub
   process. This allows a behaviour similar to typical UDP based servers like ntpd
   or named. This address works well with socat UDP-SENDTO address peers.nl()
   label(NOTE_RECVFROM)Note: When the second address fails before entering the transfer loop the
   packet is dropped. Use option link(retry)(OPTION_RETRY) or
   link(forever)(OPTION_FOREVER) on the second address to avoid data loss.
   nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE) nl()
   Useful options:
   link(fork)(OPTION_FORK),
   link(ttl)(OPTION_TTL),
   link(tos)(OPTION_TOS),
   link(bind)(OPTION_BIND),
   link(sourceport)(OPTION_SOURCEPORT),
   link(pf)(OPTION_PROTOCOL_FAMILY)nl()
   See also:
   link(UDP4-RECVFROM)(ADDRESS_UDP4_RECVFROM),
   link(UDP6-RECVFROM)(ADDRESS_UDP6_RECVFROM),
   link(UDP-SENDTO)(ADDRESS_UDP_SENDTO),
   link(UDP-RECV)(ADDRESS_UDP_RECV),
   link(UDP-CONNECT)(ADDRESS_UDP_CONNECT),
   link(UDP-LISTEN)(ADDRESS_UDP_LISTEN),
   link(IP-RECVFROM)(ADDRESS_IP_RECVFROM),
   link(UNIX-RECVFROM)(ADDRESS_UNIX_RECVFROM)
label(ADDRESS_UDP4_RECVFROM)dit(bf(tt(UDP4-RECVFROM:<port>)))
   Like link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM), but only supports IPv4 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE)
label(ADDRESS_UDP6_RECVFROM)dit(bf(tt(UDP6-RECVFROM:<port>)))
   Like link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM), but only supports IPv6 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6),link(CHILD)(GROUP_CHILD),link(RANGE)(GROUP_RANGE)

label(ADDRESS_UDP_RECV)dit(bf(tt(UDP-RECV:<port>)))
   Creates a UDP socket on <port> [link(UDP service)(TYPE_UDP_SERVICE)] using UDP/IP version 4 or 6
   depending on option link(pf)(OPTION_PROTOCOL_FAMILY).
   It receives packets from multiple unspecified peers and merges the data.
   No replies are possible. It works well with, e.g., socat
   link(UDP-SENDTO)(ADDRESS_UDP_SENDTO) address peers; it behaves similar to a
   syslog server.nl()
   This is a read-only address, see options link(-u)(option_u) and
   link(-U)(option_U), and link(dual addresses)(ADDRESS_DUAL).nl()
   Note: if you need the link(fork)(OPTION_FORK) option, use link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM) in unidirectional mode (with link(option -u)(option_u)) instead.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(IP6)(GROUP_IP6),link(RANGE)(GROUP_RANGE) nl()
   Useful options:
   link(pf)(OPTION_PROTOCOL_FAMILY),
   link(bind)(OPTION_BIND),
   link(sourceport)(OPTION_SOURCEPORT),
   link(ttl)(OPTION_TTL),
   link(tos)(OPTION_TOS)nl()
   See also:
   link(UDP4-RECV)(ADDRESS_UDP4_RECV),
   link(UDP6-RECV)(ADDRESS_UDP6_RECV),
   link(UDP-SENDTO)(ADDRESS_UDP_SENDTO),
   link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM),
   link(UDP-CONNECT)(ADDRESS_UDP_CONNECT),
   link(UDP-LISTEN)(ADDRESS_UDP_LISTEN),
   link(IP-RECV)(ADDRESS_IP_RECV),
   link(UNIX-RECV)(ADDRESS_UNIX_RECV)
label(ADDRESS_UDP4_RECV)dit(bf(tt(UDP4-RECV:<port>)))
   Like link(UDP-RECV)(ADDRESS_UDP_RECV), but only supports IPv4 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP4)(GROUP_IP4),link(RANGE)(GROUP_RANGE)
label(ADDRESS_UDP6_RECV)dit(bf(tt(UDP6-RECV:<port>)))
   Like link(UDP-RECV)(ADDRESS_UDP_RECV), but only supports IPv6 protocol.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(IP6)(GROUP_IP6),link(RANGE)(GROUP_RANGE)

label(ADDRESS_UNIX_CONNECT)dit(bf(tt(UNIX-CONNECT:<filename>)))
   Connects to link(<filename>)(TYPE_FILENAME) assuming it is a unixdomain()
   socket.
   If <filename> does not exist, this is an error;
   if <filename> is not a unixdomain() socket, this is an error;
   if <filename> is a unixdomain() socket, but no process is listening, this is
   an error.nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(NAMED)(GROUP_NAMED),link(RETRY)(GROUP_RETRY),link(UNIX)(GROUP_SOCK_UNIX) nl())
   Useful options:
   link(bind)(OPTION_BIND)nl()
   See also:
   link(UNIX-LISTEN)(ADDRESS_UNIX_LISTEN),
   link(UNIX-SENDTO)(ADDRESS_UNIX_SENDTO),
   link(TCP)(ADDRESS_TCP_CONNECT)

label(ADDRESS_UNIX_LISTEN)dit(bf(tt(UNIX-LISTEN:<filename>)))
   Listens on link(<filename>)(TYPE_FILENAME) using a unixdomain() stream
   socket and accepts a connection.
   If <filename> exists and is not a socket, this is an error.
   If <filename> exists and is a unixdomain() socket, binding to the address
   fails (use option link(unlink-early)(OPTION_UNLINK_EARLY)!).
   Note that opening this address usually blocks until a client connects.
   Beginning with socat version 1.4.3, the file system entry is removed when
   this address is closed (but see option link(unlink-close)(OPTION_UNLINK_CLOSE)) (link(example)(EXAMPLE_ADDRESS_UNIX_LISTEN)).nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(NAMED)(GROUP_NAMED),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY),link(UNIX)(GROUP_SOCK_UNIX) nl()
   Useful options:
   link(fork)(OPTION_FORK),
   link(umask)(OPTION_UMASK),
   link(mode)(OPTION_MODE),
   link(user)(OPTION_USER),
   link(group)(OPTION_GROUP),
   link(unlink-early)(OPTION_UNLINK_EARLY)nl() 
   See also:
   link(UNIX-CONNECT)(ADDRESS_UNIX_CONNECT),
   link(UNIX-RECVFROM)(ADDRESS_UNIX_RECVFROM),
   link(UNIX-RECV)(ADDRESS_UNIX_RECV),
   link(TCP-LISTEN)(ADDRESS_TCP4_LISTEN)

label(ADDRESS_UNIX_SENDTO)dit(bf(tt(UNIX-SENDTO:<filename>)))
   Communicates with the specified peer socket, defined by [link(<filename>)(TYPE_FILENAME)] assuming it is a unixdomain() datagram socket.
   It sends packets to and receives packets from that peer socket only.
   Please note that it might be necessary to link(bind)(OPTION_BIND) the
   local socket to an address (e.g. tt(/tmp/sock1), which must not exist
   before).
   This address type works well with socat UNIX-RECVFROM and UNIX-RECV address
   peers.nl() 
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(NAMED)(GROUP_NAMED),link(UNIX)(GROUP_SOCK_UNIX)nl()
   Useful options:
   link(bind)(OPTION_BIND)nl()
   See also:
   link(UNIX-RECVFROM)(ADDRESS_UNIX_RECVFROM),
   link(UNIX-RECV)(ADDRESS_UNIX_RECV),
   link(UNIX-CONNECT)(ADDRESS_UNIX_CONNECT),
   link(UDP-SENDTO)(ADDRESS_UDP_SENDTO),
   link(IP-SENDTO)(ADDRESS_IP_SENDTO)

label(ADDRESS_UNIX_RECVFROM)dit(bf(tt(UNIX-RECVFROM:<filename>)))
   Creates a unixdomain() datagram socket [link(<filename>)(TYPE_FILENAME)].
   Receives one packet and may send one or more answer packets to that peer.
   This mode is particularly useful with fork option where each arriving packet - from arbitrary peers - is handled by its own sub process.
   This address works well with socat UNIX-SENDTO address peers.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(NAMED)(GROUP_NAMED),link(CHILD)(GROUP_CHILD),link(UNIX)(GROUP_SOCK_UNIX) nl()
   See the link(note about RECVFROM addresses)(NOTE_RECVFROM).nl()
   Useful options:
   link(fork)(OPTION_FORK)nl()
   link(umask)(OPTION_UMASK)nl()
   See also:
   link(UNIX-SENDTO)(ADDRESS_UNIX_SENDTO),
   link(UNIX-RECV)(ADDRESS_UNIX_RECV),
   link(UNIX-LISTEN)(ADDRESS_UNIX_LISTEN),
   link(UDP-RECVFROM)(ADDRESS_UDP_RECVFROM),
   link(IP-RECVFROM)(ADDRESS_IP_RECVFROM)

label(ADDRESS_UNIX_RECV)dit(bf(tt(UNIX-RECV:<filename>)))
   Creates a unixdomain() datagram socket [link(<filename>)(TYPE_FILENAME)].
   Receives packets from multiple unspecified peers and merges the data.
   No replies are possible, this is a read-only address, see options link(-u)(option_u) and
   link(-U)(option_U), and link(dual addresses)(ADDRESS_DUAL).
   It can be, e.g., addressed by socat UNIX-SENDTO address peers.
   It behaves similar to a syslog server.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(NAMED)(GROUP_NAMED),link(UNIX)(GROUP_SOCK_UNIX) nl()
   Useful options:
   link(umask)(OPTION_UMASK)nl()
   See also:
   link(UNIX-SENDTO)(ADDRESS_UNIX_SENDTO),
   link(UNIX-RECVFROM)(ADDRESS_UNIX_RECVFROM),
   link(UNIX-LISTEN)(ADDRESS_UNIX_LISTEN),
   link(UDP-RECV)(ADDRESS_UDP_RECV),
   link(IP-RECV)(ADDRESS_IP_RECV)

label(ADDRESS_UNIX_CLIENT)dit(bf(tt(UNIX-CLIENT:<filename>)))
   Communicates with the specified peer socket, defined by
   [link(<filename>)(TYPE_FILENAME)] assuming it is a unixdomain() socket.
   It first tries to connect and, if that fails, assumes it is a datagram
   socket, thus supporting both types.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(NAMED)(GROUP_NAMED),link(UNIX)(GROUP_SOCK_UNIX) nl()
   Useful options:
   link(bind)(OPTION_BIND)nl()
   See also:
   link(UNIX-CONNECT)(ADDRESS_UNIX_CONNECT),
   link(UNIX-SENDTO)(ADDRESS_UNIX_SENDTO),
   link(GOPEN)(ADDRESS_GOPEN)

label(ADDRESS_VSOCK_CONNECT)dit(bf(tt(VSOCK-CONNECT:<cid>:<port>)))
   Establishes a VSOCK stream connection to the specified <cid> [link(VSOCK
   cid)(TYPE_VSOCK_ADDRESS)] and <port> [link(VSOCK port)(TYPE_VSOCK_PORT)].nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(bind)(OPTION_BIND),
   link(connect-timeout)(OPTION_CONNECT_TIMEOUT),
   link(retry)(OPTION_RETRY),
   link(readbytes)(OPTION_READBYTES)nl()
   See also:
   link(VSOCK-LISTEN)(ADDRESS_VSOCK_LISTEN),

label(ADDRESS_VSOCK_LISTEN)dit(bf(tt(VSOCK-LISTEN:<port>)))
   Listens on <port> [link(VSOCK port)(TYPE_VSOCK_PORT)] and accepts a
   VSOCK connection.
   Note that opening this address usually blocks until a client connects.nl()
   Option groups: link(FD)(GROUP_FD),link(SOCKET)(GROUP_SOCKET),link(LISTEN)(GROUP_LISTEN),link(CHILD)(GROUP_CHILD),link(RETRY)(GROUP_RETRY) nl()
   Useful options:
   link(fork)(OPTION_FORK),
   link(bind)(OPTION_BIND),
   link(max-children)(OPTION_MAX_CHILDREN),
   link(backlog)(OPTION_BACKLOG),
   link(su)(OPTION_SUBSTUSER),
   link(reuseaddr)(OPTION_SO_REUSEADDR),
   link(retry)(OPTION_RETRY)nl()
   See also:
   link(VSOCK-CONNECT)(ADDRESS_VSOCK_CONNECT)

dit(bf(tt(ABSTRACT-CONNECT:<string>)))
dit(bf(tt(ABSTRACT-LISTEN:<string>)))
dit(bf(tt(ABSTRACT-SENDTO:<string>)))
dit(bf(tt(ABSTRACT-RECVFROM:<string>)))
dit(bf(tt(ABSTRACT-RECV:<string>)))
dit(bf(tt(ABSTRACT-CLIENT:<string>)))
   The ABSTRACT addresses are almost identical to the related UNIX addresses
   except that they do not address file system based sockets but an alternate
   unixdomain() address space. To achieve this the socket address strings are
   prefixed with "\0" internally. This feature is available (only?) on Linux.
   Option groups are the same as with the related UNIX addresses, except that
   the ABSTRACT addresses are not member of the NAMED group.nl()
   Useful options:
   link(netns)(OPTION_NETNS)
enddit()


label(ADDRESS_OPTIONS)
manpagesection(ADDRESS OPTIONS)

Address options can be applied to address specifications to influence the
process of opening the addresses and the 
properties of the resulting data channels. 

For technical reasons not every option can be
applied to every address type; e.g., applying a socket option to a regular file
will fail. To catch most useless combinations as early as in the open phase,
the concept of em(option groups) was introduced. Each option belongs to one
or more option groups. Options can be used only with address types that support
at least one of their option groups (but see link(option -g)(option_g)).

Address options have data types that their values must conform to. 
Every address option consists of just a keyword or a keyword followed by
"=value", where value must conform to the options type.
COMMENT(Options that trigger a call with
trivial parameters are described with type BOOL which might be misleading.)
Some address options manipulate parameters of system calls;
e.g., option sync sets the code(O_SYNC) flag with the code(open()) call. 
Other options cause a system or library call; e.g., with option `ttl=value'
the code(setsockopt(fd, SOL_IP, IP_TTL, value, sizeof(int))) call is applied.
Other
options set internal socat() variables that are used during data transfer;
e.g., `crnl' causes explicit character conversions. 
A few options have more complex implementations; e.g., su-d
(substuser-delayed) inquires some user and group infos, stores them, and
applies them later after a possible code(chroot()) call.

If multiple options are given to an address, their sequence in the address specification has (almost) no
effect on the sequence of their execution/application. Instead, socat() has
built in an em(option phase) model that tries to bring the options in a useful
order. Some options exist in different forms (e.g., 
unlink, unlink-early, unlink-late) to control the time of their execution.

If the same option is specified more than once within one address
specification, with equal or different values, the effect depends on the kind of option. Options
resulting in function calls like code(setsockopt()) cause multiple
invocations. With options that set parameters for a required call like
code(open()) 
or set internal flags, the value of the last option occurrence is effective.

The existence or semantics of many options are system dependent. Socat()
usually does NOT try to emulate missing libc or kernel features, it just
provides an 
interface to the underlying system. So, if an operating system lacks a feature,
the related option is simply not available on this platform.

The following paragraphs introduce just the more common address options. For
a more comprehensive reference and to find information about canonical option
names, alias names, option phases, and platforms see file file(xio.help). 
nl() nl()

startdit()enddit()nl()


label(GROUP_FD)em(bf(FD option group))

This option group contains options that are applied to a unix()
style file descriptor, no matter how it was generated.
Because all current socat() address types are file descriptor based, these
options may be applied to any address. nl()
Note: Some of these options are also member of another option group, that
provides another, non-fd based mechanism.
For these options, it depends on the actual address type and its option groups 
which mechanism is used. The second, non-fd based mechanism is prioritized.
startdit()
label(OPTION_CLOEXEC)dit(bf(tt(cloexec[=<bool>])))
   Sets the code(FD_CLOEXEC) flag with the code(fcntl()) system call to value
   link(<bool>)(TYPE_BOOL). If set,
   the file descriptor is closed on code(exec()) family function calls. Socat()
   internally handles 
   this flag for the fds it controls, so in most cases there will be no need to
   apply this option. 
label(OPTION_SETLK_WR)dit(bf(tt(setlk[=<bool>])))
   Tries to set a discretionary write lock to the whole file using the code(fcntl(fd,
   F_SETLK, ...)) system call. If the file is already locked, this call results
   in an error. 
   On Linux, when the file permissions for group are "S" (g-x,g+s), and the
   file system is locally mounted with the "mand" option, the lock is
   mandatory, i.e. prevents other processes from opening the file.
label(OPTION_SETLKW_WR)dit(bf(tt(setlkw[=<bool>])))
   Tries to set a discretionary waiting write lock to the whole file using the
   code(fcntl(fd, F_SETLKW, ...)) system call. If the file is already locked,
   this call blocks. 
   See option link(setlk)(OPTION_SETLK_WR) for information about making this
   lock mandatory. 
label(OPTION_SETLK_RD)dit(bf(tt(setlk-rd[=<bool>])))
   Tries to set a discretionary read lock to the whole file using the code(fcntl(fd,
   F_SETLK, ...)) system call. If the file is already write locked, this call
   results in an error. 
   See option link(setlk)(OPTION_SETLK_WR) for information about making this
   lock mandatory. 
label(OPTION_SETLKW_RD)dit(bf(tt(setlkw-rd[=<bool>])))
   Tries to set a discretionary waiting read lock to the whole file using the
   code(fcntl(fd, F_SETLKW, ...)) system call. If the file is already write
   locked, this call blocks. 
   See option link(setlk)(OPTION_SETLK_WR) for information about making this
   lock mandatory. 
label(OPTION_FLOCK_EX)dit(bf(tt(flock-ex[=<bool>])))
   Tries to set a blocking exclusive advisory lock to the file using the
   code(flock(fd, LOCK_EX)) system call. Socat() hangs in this call if the file
   is locked by another process.
label(OPTION_FLOCK_EX_NB)dit(bf(tt(flock-ex-nb[=<bool>])))
   Tries to set a nonblocking exclusive advisory lock to the file using the
   code(flock(fd, LOCK_EX|LOCK_NB)) system call. If the file is already locked,
   this option results in an error.
label(OPTION_FLOCK_SH)dit(bf(tt(flock-sh[=<bool>])))
   Tries to set a blocking shared advisory lock to the file using the
   code(flock(fd, LOCK_SH)) system call. Socat() hangs in this call if the file
   is locked by another process.
label(OPTION_FLOCK_SH_NB)dit(bf(tt(flock-sh-nb[=<bool>])))
   Tries to set a nonblocking shared advisory lock to the file using the
   code(flock(fd, LOCK_SH|LOCK_NB)) system call. If the file is already locked,
   this option results in an error.
label(OPTION_LOCK)dit(bf(tt(lock[=<bool>])))
   Sets a blocking lock on the file. Uses the setlk or flock mechanism
   depending on availability on the particular platform. If both are available,
   the POSIX variant (setlkw) is used.
label(OPTION_USER)dit(bf(tt(user=<user>)))
   Sets the link(<user>)(TYPE_USER) (owner) of the stream.
   If the address is member of the NAMED option group,
   socat() uses the code(chown()) system call after opening the
   file or binding to the unixdomain() socket (race condition!).
   Without filesystem entry, socat() sets the user of the stream 
   using the code(fchown()) system call.
   These calls might require root privilege. 
label(OPTION_USER_LATE)dit(bf(tt(user-late=<user>)))
   Sets the owner of the fd to link(<user>)(TYPE_USER) with the code(fchown())
   system call after opening 
   or connecting the channel.
   This is useful only on file system entries.
label(OPTION_GROUP)dit(bf(tt(group=<group>)))
   Sets the link(<group>)(TYPE_GROUP) of the stream.
   If the address is member of the NAMED option group,
   socat() uses the code(chown()) system call after opening the
   file or binding to the unixdomain() socket (race condition!).
   Without filesystem entry, socat() sets the group of the stream 
   with the code(fchown()) system call. 
   These calls might require group membership or root privilege. 
label(OPTION_GROUP_LATE)dit(bf(tt(group-late=<group>)))
   Sets the group of the fd to link(<group>)(TYPE_GROUP) with the
   code(fchown()) system call after opening 
   or connecting the channel.
   This is useful only on file system entries. 
label(OPTION_MODE)dit(bf(tt(mode=<mode>)))
   Sets the <mode> [link(mode_t)(TYPE_MODE_T)] (permissions) of the stream.
   If the address is member of the NAMED option group and
   uses the code(open()) or code(creat()) call, the mode is applied with these.
   If the address is member of the NAMED option group without using these
   system calls, socat() uses the code(chmod()) system call after opening the
   filesystem entry or binding to the unixdomain() socket (race condition!).
   Otherwise, socat() sets the mode of the stream
   using code(fchmod()). 
   These calls might require ownership or root privilege.
label(OPTION_PERM_LATE)dit(bf(tt(perm-late=<mode>)))
   Sets the permissions of the fd to value <mode>
   [link(mode_t)(TYPE_MODE_T)] using the code(fchmod()) system call after
   opening or connecting the channel.
   This is useful only on file system entries. 
label(OPTION_APPEND)dit(bf(tt(append[=<bool>])))
   Always writes data to the actual end of file.
   If the address is member of the OPEN option group, 
   socat() uses the code(O_APPEND) flag with the code(open()) system call
   (link(example)(EXAMPLE_OPTION_APPEND)).
   Otherwise, socat() applies the code(fcntl(fd, F_SETFL, O_APPEND)) call.
label(OPTION_NONBLOCK)dit(bf(tt(nonblock[=<bool>])))
   Tries to open or use file in nonblocking mode. Its only effects are that the
   code(connect()) call of TCP addresses does not block, and that opening a
   named pipe for reading does not block.
   If the address is member of the OPEN option group,
   socat() uses the code(O_NONBLOCK) flag with the code(open()) system call.
   Otherwise, socat() applies the code(fcntl(fd, F_SETFL, O_NONBLOCK)) call.
COMMENT(label(OPTION_NDELAY)dit(bf(tt(ndelay[=<bool>])))
   Tries to open or use file in nonblocking mode. Has no effect because socat()
   works with code(select()).) 
COMMENT(label(OPTION_ASYNC)dit(bf(tt(async[=<bool>])))
   Enables SIGIO for this fd. Has no effect, because socat() ignores SIGIO.)
label(OPTION_O_BINARY)dit(bf(tt(binary[=<bool>])))
   Opens the file in binary mode to avoid implicit line terminator
   conversions (Cygwin).
label(OPTION_O_TEXT)dit(bf(tt(text[=<bool>])))
   Opens the file in text mode to force implicit line terminator conversions
   (Cygwin).
label(OPTION_O_NOINHERIT)dit(bf(tt(noinherit[=<bool>])))
   Does not keep this file open in a spawned process (Cygwin).
label(OPTION_COOL_WRITE)dit(bf(tt(cool-write[=<bool>])))
   Takes it easy when write fails with EPIPE or ECONNRESET and logs the message
   with em(notice) level instead of em(error).
   This prevents the log file from being filled with useless error messages
   when socat() is used as a high volume server or proxy where clients often
   abort the connection. Use this option only with option
   link(fork)(OPTION_FORK) because otherwise it might cause socat() to exit
   with code 0 even on failure.nl()
   This option is deprecated, consider using
   link(option children-shutup)(OPTION_CHILDRED_SHUTUP) instead.
label(OPTION_END_CLOSE)dit(bf(tt(end-close[=<bool>])))
   Changes the (address dependent) method of ending a connection to just close
   the file descriptors. This is useful when the connection is to be reused by
   or shared with other processes (link(example)(EXAMPLE_END_CLOSE)).nl()
   Normally, socket connections will be ended with tt(shutdown(2)) which
   terminates the socket even if it is shared by multiple processes. 
   tt(close(2)) "unlinks" the socket from the process but keeps it active as
   long as there are still links from other processes.nl()
   Similarly, when an address of type EXEC or SYSTEM is ended, socat usually
   will explicitly kill the sub process. With this option, it will just close
   the file descriptors.
label(OPTION_SHUT_NONE)dit(bf(tt(shut-none[=<bool>])))
   Changes the (address dependent) method of shutting down the write part of a
   connection to not do anything.
label(OPTION_SHUT_DOWN)dit(bf(tt(shut-down[=<bool>])))
   Changes the (address dependent) method of shutting down the write part of a
   connection to NOEXPAND(shutdown(fd, SHUT_WR)). Is only useful with sockets.
label(OPTION_SHUT_CLOSE)dit(bf(tt(shut-close[=<bool>])))
   Changes the (address dependent) method of shutting down the write part of a
   connection to NOEXPAND(close(fd)).
label(OPTION_SHUT_NULL)dit(bf(tt(shut-null[=<bool>])))
   When one address indicates EOF, socat() will send a zero sized packet to the
   write channel of the other address to transfer the EOF condition. This is
   useful with UDP and other datagram protocols. Has been tested against
   netcat and socat with option link(null-eof)(OPTION_NULL_EOF).
label(OPTION_NULL_EOF)dit(bf(tt(null-eof[=<bool>])))
   Normally socat() will ignore empty (zero size payload) packets arriving on
   datagram sockets, so it survives port scans. With this option socat()
   interprets empty datagram packets as EOF indicator (see
   link(shut-null)(OPTION_SHUT_NULL)).
label(OPTION_IOCTL_VOID)dit(bf(tt(ioctl-void=<request>)))
   Calls tt(ioctl()) with the request value as second argument and NULL as
   third argument. This option allows utilizing ioctls that are not
   explicitly implemented in socat.
label(OPTION_IOCTL_INT)dit(bf(tt(ioctl-int=<request>:<value>)))
   Calls tt(ioctl()) with the request value as second argument and the integer
   value as third argument.
label(OPTION_IOCTL_INTP)dit(bf(tt(ioctl-intp=<request>:<value>)))
   Calls tt(ioctl()) with the request value as second argument and a pointer to
   the integer value as third argument.
label(OPTION_IOCTL_BIN)dit(bf(tt(ioctl-bin=<request>:<value>)))
   Calls tt(ioctl()) with the request value as second argument and a pointer to
   the given data value as third argument. This data must be specified in
   link(<dalan>)(TYPE_DATA) form.
label(OPTION_IOCTL_STRING)dit(bf(tt(ioctl-string=<request>:<value>)))
   Calls tt(ioctl()) with the request value as second argument and a pointer to
   the given string as third argument.
   link(<dalan>)(TYPE_DATA) form.
enddit()

startdit()enddit()nl()


label(GROUP_NAMED)em(bf(NAMED option group))

These options work on file system entries.nl()
Please note that, with UNIX domain client addresses, this means the bind entry,
not the target/peer entry.nl()
See also options link(user)(OPTION_USER), link(group)(OPTION_GROUP), and
link(mode)(OPTION_MODE).

startdit()
label(OPTION_USER_EARLY)dit(bf(tt(user-early=<user>)))
   Changes the link(<user>)(TYPE_USER) (owner) of the file system entry before
   accessing it, using the 
   code(chown()) system call. This call might require root privilege.
label(OPTION_GROUP_EARLY)dit(bf(tt(group-early=<group>)))
   Changes the link(<group>)(TYPE_GROUP) of the file system entry before
   accessing it, using the 
   code(chown()) system call. This call might require group membership or root
   privilege. 
label(OPTION_PERM_EARLY)dit(bf(tt(perm-early=<mode>)))
   Changes the <mode> [link(mode_t)(TYPE_MODE_T)] of the file system entry
   before accessing it, using the 
   code(chmod()) system call. This call might require ownership or root
   privilege. 
label(OPTION_UNLINK_EARLY)dit(bf(tt(unlink-early[=<bool>])))
   Unlinks (removes) the file before opening it and even before applying
   user-early etc. 
label(OPTION_UNLINK)dit(bf(tt(unlink[=<bool>])))
   Unlinks (removes) the file before accessing it, but after user-early etc.
label(OPTION_UNLINK_LATE)dit(bf(tt(unlink-late[=<bool>])))
   Unlinks (removes) the file after opening it to make it inaccessible for
   other processes after a short race condition. 
label(OPTION_UNLINK_CLOSE)dit(bf(tt(unlink-close[=<bool>])))
   Controls removal of the addresses file system entry when closing the address.
   For link(named pipes)(ADDRESS_NAMED_PIPE),
   link(UNIX domain sockets)(ADDRESS_UNIX_LISTEN),
   and the link(symbolic links)(OPTION_SYMBOLIC_LINK) of link(pty addresses)(ADDRESS_PTY),
   the default is remove (1); for link(created files)(ADDRESS_CREAT),
   link(opened files)(ADDRESS_OPEN), and
   link(generic opened files)(ADDRESS_GOPEN) the default is keep (0).
   Setting this option to 1 removes the entry, 0 keeps it. No value means 1.
enddit()

startdit()enddit()nl()


label(GROUP_OPEN)em(bf(OPEN option group))

The OPEN group options allow setting flags with the code(open()) system call. 
E.g., option `creat' sets the code(O_CREAT) flag. When the used address does
not use code(open()) (e.g.STDIO), the code(fcntl(..., F_SETFL, ...)) call is
used instead.nl()
See also options link(append)(OPTION_APPEND) and
link(nonblock)(OPTION_NONBLOCK).
startdit()
label(OPTION_O_CREAT)dit(bf(tt(creat[=<bool>])))
   Creates the file if it does not exist (link(example)(EXAMPLE_OPTION_CREAT)).
label(OPTION_DSYNC)dit(bf(tt(dsync[=<bool>])))
   Blocks code(write()) calls until metainfo is physically written to media.
label(OPTION_EXCL)dit(bf(tt(excl[=<bool>])))
   With option creat, if file exists this is an error.
label(OPTION_LARGEFILE)dit(bf(tt(largefile[=<bool>])))
   On 32 bit systems, allows a file larger than 2^31 bytes.
label(OPTION_O_NOATIME)dit(bf(tt(noatime[=<bool>])))
   Sets the O_NOATIME options, so reads do not change the access timestamp.
label(OPTION_NOCTTY)dit(bf(tt(noctty[=<bool>])))
   Does not make this file the controlling terminal.
label(OPTION_NOFOLLOW)dit(bf(tt(nofollow[=<bool>])))
   Does not follow symbolic links.
label(OPTION_NSHARE)dit(bf(tt(nshare[=<bool>])))
   Does not allow sharing this file with other processes.
label(OPTION_RSHARE)dit(bf(tt(rshare[=<bool>])))
   Does not allow other processes to open this file for writing.
label(OPTION_RSYNC)dit(bf(tt(rsync[=<bool>])))
   Blocks code(write()) until metainfo is physically written to media.
label(OPTION_SYNC)dit(bf(tt(sync[=<bool>])))
   Blocks code(write()) until data is physically written to media.
COMMENT(label(OPTION_DEFER)dit(bf(tt(defer[=<bool>])))
   Temporarily stores write data in paging space.)
COMMENT(label(OPTION_DELAY)dit(bf(tt(delay[=<bool>])))
   Blocks code(open()) until share conditions are fulfilled.)
COMMENT(label(OPTION_DIRECT)dit(bf(tt(direct[=<bool>]))))
COMMENT(label(OPTION_DIRECTORY)dit(bf(tt(directory[=<bool>])))
   Fails if file is not a directory. Not useful with socat().)
label(OPTION_RDONLY)dit(bf(tt(rdonly[=<bool>])))
   Opens the file for reading only.
COMMENT(label(OPTION_RDWR)dit(bf(tt(rdwr[=<bool>])))
   Opens the file for reading and writing.)
label(OPTION_WRONLY)dit(bf(tt(wronly[=<bool>])))
   Opens the file for writing only.
label(OPTION_O_TRUNC)dit(bf(tt(trunc[=<bool>])))
   Truncates the file to size 0 during opening it.
enddit()


startdit()enddit()nl()


label(GROUP_REG)em(bf(REG and BLK option group))

These options are usually applied to a unix() file descriptor, but their
semantics make sense only on a file supporting random access.
startdit()
label(OPTION_SEEK)dit(bf(tt(seek=<offset>)))
   Applies the code(lseek(fd, <offset>, SEEK_SET)) (or code(lseek64)) system
   call, thus positioning the file pointer absolutely to <offset>
   [link(off_t)(TYPE_OFF) or link(off64_t)(TYPE_OFF64)]. Please note that a
   missing value defaults to 1, not 0.
label(OPTION_SEEK_CUR)dit(bf(tt(seek-cur=<offset>)))
   Applies the code(lseek(fd, <offset>, SEEK_CUR)) (or code(lseek64)) system
   call, thus positioning the file pointer <offset> [link(off_t)(TYPE_OFF) or
   link(off64_t)(TYPE_OFF64)] bytes relatively to its current position (which
   is usually 0). Please note that a missing value defaults to 1, not 0.
label(OPTION_SEEK_END)dit(bf(tt(seek-end=<offset>)))
   Applies the code(lseek(fd, <offset>, SEEK_END)) (or code(lseek64)) system
   call, thus positioning the file pointer <offset> [link(off_t)(TYPE_OFF) or
   link(off64_t)(TYPE_OFF64)] bytes relatively to the files current end. Please
   note that a missing value defaults to 1, not 0.  
label(OPTION_FTRUNCATE)dit(bf(tt(ftruncate=<offset>)))
   Applies the code(ftruncate(fd, <offset>))
   (or code(ftruncate64) if available) system call, thus
   truncating the file at the position <offset> [link(off_t)(TYPE_OFF) or 
   link(off64_t)(TYPE_OFF64)]. Please note that a missing value defaults to 1,
   not 0.

label(OPTION_FS_SECRM_FL)dit(bf(tt(secrm[=<bool>])))
label(OPTION_FS_UNRM)dit(bf(tt(unrm[=<bool>])))
label(OPTION_FS_COMPR)dit(bf(tt(compr[=<bool>])))
label(OPTION_FS_SYNC)dit(bf(tt(fs-sync[=<bool>])))
label(OPTION_FS_IMMUTABLE)dit(bf(tt(immutable[=<bool>])))
label(OPTION_FS_APPEND)dit(bf(tt(fs-append[=<bool>])))
label(OPTION_FS_NODUMP)dit(bf(tt(nodump[=<bool>])))
label(OPTION_FS_NOATIME)dit(bf(tt(fs-noatime[=<bool>])))
label(OPTION_FS_JOURNAL_DATA)dit(bf(tt(journal-data[=<bool>])))
label(OPTION_FS_NOTAIL)dit(bf(tt(notail[=<bool>])))
label(OPTION_FS_DIRSYNC)dit(bf(tt(dirsync[=<bool>])))
   These options change non standard file attributes on operating systems and
   file systems that support these features, like Linux with ext2fs and
   successors, xfs, or reiserfs. See man 1 chattr for information on these
   options. Please note that there might be a race condition between creating
   the file and applying these options.
enddit()

startdit()enddit()nl()


label(GROUP_ADDRS)em(bf(General address options))

These options may be applied to all address types. They change some process
properties that are restored after opening the address.

startdit()
label(OPTION_CHDIR)dit(bf(tt(chdir=<filename>))) dit(bf(tt(cd=<filename>)))
   Changes the working directory. After opening the address the master process
   changes back to the original working directory. Sub processes inherit the
   temporary setting.
label(OPTION_UMASK)dit(bf(tt(umask=<mode>)))
   Sets the umask of the process to <mode> [link(mode_t)(TYPE_MODE_T)] before
   opening the address. Useful when file system entries are created or a shell
   or program is invoked. Usually the value is specified as octal number.nl()
   The processes tt(umask) value is inherited by child processes.
   Note: umask is an inverted value: creating a file with umask=0026 results in
   permissions 0640.
enddit()

startdit()enddit()nl()


label(GROUP_PROCESS)em(bf(PROCESS option group))

Options of this group change the process properties instead of just affecting
one data channel.
For EXEC and SYSTEM addresses and for LISTEN and CONNECT type addresses with
option link(fork)(OPTION_FORK),
these options apply to the child processes instead of the main socat() process.
startdit()
label(OPTION_CHROOT)dit(bf(tt(chroot=<directory>)))
   Performs a code(chroot()) operation to link(<directory>)(TYPE_DIRECTORY)
   after processing the address (link(example)(EXAMPLE_OPTION_CHROOT)). This call might require root privilege.
label(OPTION_CHROOT_EARLY)dit(bf(tt(chroot-early=<directory>)))
   Performs a code(chroot()) operation to link(<directory>)(TYPE_DIRECTORY)
   before opening the address. This call might require root privilege.
label(OPTION_SETGID)dit(bf(tt(setgid=<group>)))
   Changes the primary link(<group>)(TYPE_GROUP) of the process after
   processing the address. This call might require root privilege. Please note
   that this option does not drop other group related privileges.
label(OPTION_SETGID_EARLY)dit(bf(tt(setgid-early=<group>)))
   Like link(setgit)(OPTION_SETGID) but is performed before opening the address.
label(OPTION_SETUID)dit(bf(tt(setuid=<user>)))
   Changes the link(<user>)(TYPE_USER) (owner) of the process after processing
   the address. This call might require root privilege. Please note that this
   option does not drop group related privileges. Check if option
   link(su)(OPTION_SUBSTUSER) better fits your needs.
label(OPTION_SETUID_EARLY)dit(bf(tt(setuid-early=<user>)))
   Like link(setuid)(OPTION_SETUID) but is performed before opening the
   address.
label(OPTION_SUBSTUSER)dit(bf(tt(su=<user>)))
   Changes the link(<user>)(TYPE_USER) (owner) and groups of the process after
   processing the address (link(example)(EXAMPLE_OPTION_SUBSTUSER)). This call might require root privilege. 
label(OPTION_SUBSTUSER_DELAYED)dit(bf(tt(su-d=<user>)))
   Short name for tt(substuser-delayed).
   COMMENT(Short name for bf(tt(substuser-delayed) ).)
   Changes the link(<user>)(TYPE_USER)
   (owner) and groups of the process after processing the address (link(example)(EXAMPLE_OPTION_SUBSTUSER_DELAYED)).
   The user and his groups are retrieved em(before) a possible
   code(chroot()). This call might require root privilege. 
label(OPTION_SETPGID)dit(bf(tt(setpgid=<pid_t>)))
   Makes the process a member of the specified process group
   link(<pid_t>)(TYPE_PID_T). If no value 
   is given, or if the value is 0 or 1, the process becomes leader of a new
   process group. 
label(OPTION_SETSID)dit(bf(tt(setsid)))
   Makes the process the leader of a new session (link(example)(EXAMPLE_OPTION_SETSID)).
label(OPTION_NETNS)dit(bf(tt(netns=<net-namespace-name>)))
   Before opening the address it tries to switch to the named network namespace.
   After opening the address it switches back to the previous namespace.
   (link(Example with TCP forwarder)(EXAMPLE_OPTION_NETNS),
   link(example with virtual network connection)(EXAMPLE_TUN_NETNS).nl()
   Only on Linux; requires root; use option tt(--experimental).nl()
enddit()

startdit()enddit()nl()


label(GROUP_READLINE)em(bf(READLINE option group))

These options apply to the readline address type.
startdit()
label(OPTION_HISTORY)dit(bf(tt(history=<filename>)))
   Reads and writes history from/to link(<filename>)(TYPE_FILENAME) (link(example)(EXAMPLE_OPTION_HISTORY)).
label(OPTION_NOPROMPT)dit(bf(tt(noprompt)))
   Since version 1.4.0, socat per default tries to determine a prompt - 
   that is then passed to the readline call - by remembering the last
   incomplete line of the output. With this option, socat does not pass a
   prompt to readline, so it begins line editing in the first column
   of the terminal. 
label(OPTION_NOECHO)dit(bf(tt(noecho=<pattern>)))
   Specifies a regular pattern for a prompt that prevents the following input
   line from being displayed on the screen and from being added to the history.
   The prompt is defined as the text that was output to the readline address 
   after the lastest newline character and before an input character was
   typed. The pattern is a regular expression, e.g.
   "^[Pp]assword:.*$" or "([Uu]ser:|[Pp]assword:)". See NOEXPAND(regex(7)) for details.
   (link(example)(EXAMPLE_OPTION_NOECHO))
label(OPTION_PROMPT)dit(bf(tt(prompt=<string>)))
   Passes the string as prompt to the readline function. readline prints this
   prompt when stepping through the history. If this string matches a constant
   prompt issued by an interactive program on the other socat address,
   consistent look and feel can be achieved.
enddit()

startdit()enddit()nl()


label(GROUP_APPLICATION)em(bf(APPLICATION option group))

This group contains options that work at data level.
Note that these options only apply to the "raw" data transferred by socat,
but not to protocol data used by addresses like
link(PROXY)(ADDRESS_PROXY_CONNECT).
startdit()
label(OPTION_CR)dit(bf(tt(cr)))
   Converts the default line termination character NL ('\n', 0x0a) to/from CR
   ('\r', 0x0d) when writing/reading on this channel. 
label(OPTION_CRNL)dit(bf(tt(crnl)))
   Converts the default line termination character NL ('\n', 0x0a) to/from CRNL
   ("\r\n", 0x0d0a) when writing/reading on this channel (link(example)(EXAMPLE_OPTION_CRNL)).
   Note: socat simply strips all CR characters.
label(OPTION_IGNOREEOF)dit(bf(tt(ignoreeof)))
   When EOF occurs on this channel, socat() ignores it and tries to read more
   data (like "tail -f") (link(example)(EXAMPLE_OPTION_IGNOREEOF)).
label(OPTION_READBYTES)dit(bf(tt(readbytes=<bytes>)))
   socat() reads only so many bytes from this address (the address provides
   only so many bytes for transfer and pretends to be at EOF afterwards).
   Must be greater than 0.
label(OPTION_LOCKFILE)dit(bf(tt(lockfile=<filename>)))
   If lockfile exists, exits with error. If lockfile does not exist, creates it
   and continues, unlinks lockfile on exit.
label(OPTION_WAITLOCK)dit(bf(tt(waitlock=<filename>)))
   If lockfile exists, waits until it disappears. When lockfile does not exist,
   creates it and continues, unlinks lockfile on exit.
label(OPTION_ESCAPE)dit(bf(tt(escape=<int>)))
   Specifies the numeric code of a character that triggers EOF on the input
   stream. It is useful with a terminal in raw mode
   (link(example)(EXAMPLE_OPTION_ESCAPE)).
enddit()

startdit()enddit()nl()


label(GROUP_SOCKET)em(bf(SOCKET option group))

These options are intended for all kinds of sockets, e.g. IP or unixdomain(). Most are applied with a code(setsockopt()) call.
startdit()
label(OPTION_BIND)dit(bf(tt(bind=<sockname>)))
   Binds the socket to the given socket address using the code(bind()) system
   call. The form of <sockname> is socket domain dependent:
   IP4 and IP6 allow the form [hostname|hostaddress][:(service|port)] (link(example)(EXAMPLE_OPTION_BIND_TCP4)),
   VSOCK allows the form [cid][:(port)].nl()
   See also: link(unix-bind-tempname)(OPTION_UNIX_BIND_TEMPNAME)
label(OPTION_CONNECT_TIMEOUT)dit(bf(tt(connect-timeout=<seconds>)))
   Abort the connection attempt after <seconds> [link(timeval)(TYPE_TIMEVAL)]
   with error status.
label(OPTION_SO_BINDTODEVICE)dit(bf(tt(so-bindtodevice=<interface>)))
   Binds the socket to the given link(<interface>)(TYPE_INTERFACE).
   This option might require root privilege.
label(OPTION_SO_BROADCAST)dit(bf(tt(broadcast)))
   For datagram sockets, allows sending to broadcast addresses and receiving
   packets addressed to broadcast addresses. 
COMMENT(label(OPTION_BSDCOMPAT)dit(bf(tt(bsdcompat)))
   Emulates some (old?) bugs of the BSD socket implementation.)
label(OPTION_DEBUG)dit(bf(tt(debug)))
   Enables socket debugging.
label(OPTION_DONTROUTE)dit(bf(tt(dontroute)))
   Only communicates with directly connected peers, does not use routers.
label(OPTION_KEEPALIVE)dit(bf(tt(keepalive)))
   Enables sending keepalives on the socket.
label(OPTION_LINGER)dit(bf(tt(linger=<seconds>)))
   Blocks code(shutdown()) or code(close()) until data transfers have finished
   or the given timeout [link(int)(TYPE_INT)] expired. 
COMMENT(label(OPTION_NOREUSEADDR)dit(bf(tt(noreuseaddr)))
   Set the code(SO_NOREUSEADDR) socket option.)
label(OPTION_OOBINLINE)dit(bf(tt(oobinline)))
   Places out-of-band data in the input data stream.
label(OPTION_PRIORITY)dit(bf(tt(priority=<priority>)))
   Sets the protocol defined <priority> [link(<int>)(TYPE_INT)] for outgoing
   packets. 
label(OPTION_RCVBUF)dit(bf(tt(rcvbuf=<bytes>)))
   Sets the size of the receive buffer after the code(socket()) call to
   <bytes> [link(int)(TYPE_INT)].  With TCP
   sockets, this value corresponds to the socket's maximal window size.
label(OPTION_RCVBUF_LATE)dit(bf(tt(rcvbuf-late=<bytes>)))
   Sets the size of the receive buffer when the socket is already
   connected to <bytes> [link(int)(TYPE_INT)]. 
   With TCP sockets, this value corresponds to the socket's 
   maximal window size. 
label(OPTION_SO_RCVTIMOE)dit(bf(tt(so-rcvtimeo=<time>, rcvtimeo=<time>)))
   Specifies the time [link(int)(TYPE_TIMEVAL)] until code(recv()), code(read())
   etc. functions timeout when no data is received. Note that in the transfer
   phase socat() only calls these functions when code(select()) has reported
   that data is available. However this option is useful with DTLS addresses to
   timeout during connection negotiation.
label(OPTION_SO_SNDTIMOE)dit(bf(tt(so-sndtimeo=<time>, sndtimeo=<time>)))
   Like link(so-recvtimeo)(OPTION_SO_RCVTIMOE), but for code(send). Not usecase
   known.
label(OPTION_RCVLOWAT)dit(bf(tt(rcvlowat=<bytes>)))
   Specifies the minimum number of received bytes [link(int)(TYPE_INT)] until
   the socket layer will pass the buffered data to socat(). 
label(OPTION_SO_REUSEADDR)dit(bf(tt(reuseaddr[=[0|1]])))
   Allows other sockets to bind to an address even if parts of it (e.g. the
   local port) are already in use by socat().nl()
   With version 1.7.5, this socket option is set automatically for TCP LISTEN
   addresses. If you prefer the system default (no related
   tt(setsockopt(...SO_REUSEADDR...)) call at all), use form tt(reuseaddr=).nl()
   (link(example)(EXAMPLE_OPTION_SO_REUSEADDR)).
label(OPTION_SNDBUF)dit(bf(tt(sndbuf=<bytes>)))
   Sets the size of the send buffer after the code(socket()) call to
   <bytes> [link(int)(TYPE_INT)].
label(OPTION_SNDBUF_LATE)dit(bf(tt(sndbuf-late=<bytes>)))
   Sets the size of the send buffer when the socket is connected to
   <bytes> [link(int)(TYPE_INT)].
label(OPTION_SNDLOWAT)dit(bf(tt(sndlowat=<bytes>)))
   Specifies the minimum number of bytes in the send buffer until the socket
   layer will send the data to <bytes> [link(int)(TYPE_INT)].
label(OPTION_PROTOCOL_FAMILY)dit(bf(tt(pf=<string>)))
   Forces the use of the specified IP version or protocol. <string> can be
   something like "ip4" or "ip6". The resulting value is
   used as first argument to the code(socket()) or code(socketpair()) calls.
   This option affects address resolution and the required syntax of bind and
   range options.
label(OPTION_SO_TYPE)dit(bf(tt(socktype=<type>)))
   Sets the type of the socket, specified as second argument to the
   code(socket()) or code(socketpair()) calls, to <type>
   [link(int)(TYPE_INT)]. Address resolution is not affected by this option.
   Under Linux, 1 means stream oriented socket, 2 means datagram socket, 3
   means raw socket, and 5 seqpacket (stream keeping packet boundaries).
   Datagrams are useful when you want to keep packet boundaries.
label(OPTION_SO_PROTOCOL)dit(bf(tt(protocol)))
   Sets the protocol of the socket, specified as third argument to the
   code(socket()) or code(socketpair()) calls, to <protocol>
   [link(int)(TYPE_INT)]. Address resolution is not affected by this option.
   6 means TCP, 17 means UDP.
COMMENT(label(OPTION_USELOOPBACK)dit(bf(tt(useloopback)))
   Sets the code(SO_USELOOPBACK) socket option.)
COMMENT(label(OPTION_ACCEPTCONN)dit(bf(tt(acceptconn)))
   Tries to set the code(SO_ACCEPTCONN) socket option.)
COMMENT(label(OPTION_ATTACHFILTER)dit(bf(tt(attachfilter)))
   Tries to set the code(SO_ATTACH_FILTER) socket option.)
COMMENT(label(OPTION_AUDIT)dit(bf(tt(audit)))
   Sets the code(SO_AUDIT) socket option.)
COMMENT(label(OPTION_CHSUMRECV)dit(bf(tt(cksumrecv)))
   Sets the code(SO_CKSUMRECV) socket option.)
COMMENT(label(OPTION_DETACHFILTER)dit(bf(tt(detachfilter)))
   Tries to set the code(SO_DETACH_FILTER) socket option.)
COMMENT(label(OPTION_DGRAMERRIND)dit(bf(tt(dgramerrind)))
   Sets the code(SO_DGRAM_ERRIND) socket option.)
COMMENT(label(OPTION_DONTLINGER)dit(bf(tt(dontlinger)))
   Sets the code(SO_DONTLINGER) socket option.)
COMMENT(label(OPTION_ERROR)dit(bf(tt(error)))
   Tries to set this read only socket option.)
COMMENT(label(OPTION_FIOSETOWN)dit(bf(tt(fiosetown=<pid_t>)))
   Sets the receiver of SIGIO.)
COMMENT(label(OPTION_KERNACCEPT)dit(bf(tt(kernaccept)))
   Sets the code(SO_KERNACCEPT) socket option.)
COMMENT(label(OPTION_NOCHECK)dit(bf(tt(nocheck)))
   Sets the code(SO_NO_CHECK) socket option. Undocumented...)
COMMENT(label(OPTION_PASSCRED)dit(bf(tt(passcred)))
   Set the code(SO_PASSCRED) socket option.)
COMMENT(label(OPTION_PEERCRED)dit(bf(tt(peercred)))
   This is a read-only socket option.)
label(OPTION_REUSEPORT)dit(bf(tt(reuseport)))
   Set the code(SO_REUSEPORT) socket option.
COMMENT(label(OPTION_SECURITYAUTHENTICATION)dit(bf(tt(securityauthentication)))
   Set the code(SO_SECURITY_AUTHENTICATION) socket option.)
COMMENT(label(OPTION_SECURITYENCRYPTIONNETWORK)dit(bf(tt(securityencryptionnetwork)))
   Set the code(SO_SECURITY_ENCRYPTION_NETWORK) socket option.)
COMMENT(label(OPTION_SECURITYENCRYPTIONTRANSPORT)dit(bf(tt(securityencryptiontransport)))
   Set the code(SO_SECURITY_ENCRYPTION_TRANSPORT) socket option.)
COMMENT(label(OPTION_SIOCSPGRP)dit(bf(tt(siocspgrp=<pid_t>)))
   Set the SIOCSPGRP with code(ioclt()) to enable SIGIO.)
COMMENT(label(OPTION_USEIFBUFS)dit(bf(tt(useifbufs)))
   Set the code(SO_USE_IFBUFS) socket option.)
label(OPTION_SO_TIMESTAMP)dit(bf(tt(so-timestamp)))
   Sets the SO_TIMESTAMP socket option. This enables receiving and logging of
   timestamp ancillary messages.
label(OPTION_SETSOCKOPT)dit(bf(tt(setsockopt=<level>:<optname>:<optval>)))
   Invokes tt(setsockopt()) for the socket with the given parameters. tt(level)
   [link(int)(TYPE_INT)] is used as second argument to tt(setsockopt()) and
   specifies the layer, e.g. SOL_TCP for TCP (6 on Linux), or SOL_SOCKET for
   the socket layer (1 on Linux). tt(optname) [link(int)(TYPE_INT)] is the
   third argument to tt(setsockopt()) and tells which socket option is to be
   set. For the actual numbers you might have to look up the appropriate include
   files of your system. For the 4th and 5th tt(setsockopt()) parameters,
   tt(value) [link(dalan)(TYPE_DATA)] specifies an arbitrary sequence of bytes
   that are passed to the function per pointer, with the automatically derived
   length parameter.
label(OPTION_SETSOCKOPT_INT)dit(bf(tt(setsockopt-int=<level>:<optname>:<optval>)))
   Like tt(setsockopt), but <optval> is a pointer to int [link(int)(TYPE_INT)]
label(OPTION_SETSOCKOPT_LISTEN)dit(bf(tt(setsockopt-listen=<level>:<optname>:<optval>)))
   Like tt(setsockopt), but for listen type addresses it is applied to the
   listening socket instead of the connected socket.
label(OPTION_SETSOCKOPT_STRING)dit(bf(tt(setsockopt-string=<level>:<optname>:<optval>)))
   Like tt(setsockopt), but <optval> is a link(string)(TYPE_STRING).
   This string is passed to the function with trailing null character, and the
   length parameter is automatically derived from the data.
enddit()

startdit()enddit()nl()


label(GROUP_SOCK_UNIX)em(bf(UNIX option group))

These options apply to UNIX domain based addresses.
startdit()
label(OPTION_UNIX_BIND_TEMPNAME)dit(bf(tt(bind-tempname[=/tmp/pre-XXXXXX],
   unix-bind-tempname[=/tmp/pre-XXXXXX])))
   Binds to a random path or random address (on abstract namespace sockets).
   This is useful with datagram client addresses (tt(SENDTO), or tt(CLIENT))
   that are opened in child processes forked off from a common
   parent process where the child processes cannot have different bind options.
   In the path code(X)'s get replaced with a random character sequence
   similar to NOEXPAND(tempnam(3)). When no argument is given socat() takes a
   default like code(/tmp/fileXXXXXX).nl()
label(OPTION_UNIX_TIGHTSOCKLEN)dit(bf(tt(unix-tightsocklen[=(0|1)])))
   On socket operations, pass a socket address length that does not include the
   whole code(struct sockaddr_un) record but (besides other components) only
   the relevant part of the filename or abstract string. Default is 1.
enddit()

label(GROUP_IP4)
label(GROUP_IP)em(bf(IP4 and IP6 option groups))

These options can be used with IPv4 and IPv6 based sockets.
startdit()
label(OPTION_TOS)dit(bf(tt(tos=<tos>)))
   Sets the TOS (type of service) field of outgoing packets to <tos>
   [link(byte)(TYPE_BYTE)] (see RFC 791).
label(OPTION_TTL)dit(bf(tt(ttl=<ttl>)))
   Sets the TTL (time to live) field of outgoing packets to <ttl>
   [link(byte)(TYPE_BYTE)].
label(OPTION_IPOPTIONS)dit(bf(tt(ip-options=<data>)))
   Sets IP options like source routing. Must be given in binary form,
   recommended format is a leading "x" followed by an even number of hex
   digits. This option may be used multiple times, data are appended.
   E.g., to connect to host 10.0.0.1 via some gateway using a loose source
   route, use the gateway as address parameter and set a loose source route
   using the option code(ip-options=x8307040a000001).nl()
   IP options are defined in RFC 791. COMMENT(, RFC 2113)nl()
COMMENT(   x00 end of option list
   x01 no operation (nop)
   x0211 security
   x03 loose source route
   x09 strict source route
   x07 record route
   x0804 stream ID
   x44 internet timestamp)
label(OPTION_MTUDISCOVER)dit(bf(tt(mtudiscover=<0|1|2>)))
   Takes 0, 1, 2 to never, want, or always use path MTU discover on this
   socket. 
COMMENT(label(OPTION_HRDINCL)dit(bf(tt(ip-hdrincl)))
   Tell the raw socket that the application data includes the IP header.)
COMMENT(label(OPTION_IP_MULTICAST_LOOP)dit(bf(tt(ip-multicastloop)))
   Allow looping back outgoing multicast to the local interface.)
COMMENT(label(OPTION_IP_MULTICAST_TTL)dit(bf(tt(ip-multicastttl)))
   Set the TTL for outgoing multicast packets.)
label(OPTION_IP_PKTINFO)dit(bf(tt(ip-pktinfo)))
   Sets the IP_PKTINFO socket option. This enables receiving and logging of
   ancillary messages containing destination address and interface (Linux)
   (link(example)(EXAMPLE_ANCILLARY)). 
COMMENT(label(OPTION_PKTOPTS)dit(bf(tt(ip-pktopts)))
   Set the IP_PKTOPTIONS socket option.)
label(OPTION_IP_RECVERR)dit(bf(tt(ip-recverr)))
   Sets the IP_RECVERR socket option. This enables receiving and logging of
   ancillary messages containing detailed error information.
label(OPTION_IP_RECVOPTS)dit(bf(tt(ip-recvopts)))
   Sets the IP_RECVOPTS socket option. This enables receiving and logging of IP
   options ancillary messages (Linux, *BSD).
label(OPTION_IP_RECVTOS)dit(bf(tt(ip-recvtos)))
   Sets the IP_RECVTOS socket option. This enables receiving and logging of TOS
   (type of service) ancillary messages (Linux).
label(OPTION_IP_RECVTTL)dit(bf(tt(ip-recvttl)))
   Sets the IP_RECVTTL socket option. This enables receiving and logging of TTL
   (time to live) ancillary messages (Linux, *BSD).
COMMENT(label(OPTION_RETOPTS)dit(bf(tt(ip-retopts)))
   Set the IP_RETOPTS socket option.)
label(OPTION_IP_RECVDSTADDR)dit(bf(tt(ip-recvdstaddr)))
   Sets the IP_RECVDSTADDR socket option. This enables receiving and logging of
   ancillary messages containing destination address (*BSD)
   (link(example)(EXAMPLE_ANCILLARY)).
label(OPTION_IP_RECVIF)dit(bf(tt(ip-recvif)))
   Sets the IP_RECVIF socket option. This enables receiving and logging of
   interface ancillary messages (*BSD) (link(example)(EXAMPLE_ANCILLARY)).
COMMENT(label(OPTION_ROUTERALERT)dit(bf(tt(routeralert)))
   Set the IP_ROUTER_ALERT socket option.)
label(OPTION_IP_ADD_MEMBERSHIP)
dit(bf(tt(ip-add-membership=<multicast-address:interface-address>)))
dit(bf(tt(ip-add-membership=<multicast-address:interface-name>)))
dit(bf(tt(ip-add-membership=<multicast-address:interface-index>)))
dit(bf(tt(ip-add-membership=<multicast-address:interface-address:interface-name>)))
dit(bf(tt(ip-add-membership=<multicast-address:interface-address:interface-index>)))
   Makes the socket member of the specified multicast group. This only works
   for IPv4, see link(ipv6-join-group)(OPTION_IPV6_JOIN_GROUP) for the IPv6
   variant. The option takes the IP address of the multicast group and info
   about the desired network interface. The most common syntax is the first
   one, while the others are only available on systems that provide
   tt(struct mreqn) (Linux).nl()
   The indices of active network interfaces can be shown using the utility
   procan().
label(OPTION_IP_ADD_SOURCE_MEMBERSHIP)
dit(bf(tt(ip-add-source-membership=<multicast-address:interface-address:source-address>)))
   Makes the socket member of the specified multicast group for the
   specified source, i.e. only multicast traffic from this address is to be
   delivered. This only works for IPv4, see
   link(ipv6-join-source-group)(OPTION_IPV6_JOIN_SOURCE_GROUP) for the IPv6
   variant. The option takes the IP address of the multicast group, the IP
   address of the desired network interface and the source IP address of the
   multicast traffic.
label(OPTION_IPV6_JOIN_GROUP)
dit(bf(tt(ipv6-join-group=<multicast-address:interface-name>)))
dit(bf(tt(ipv6-join-group=<multicast-address:interface-index>)))
   Makes the socket member of the specified multicast group. This only works
   for IPv6, see link(ip-add-membership)(OPTION_IP_ADD_MEMBERSHIP) for the
   IPv4 variant. The option takes the IP address of the multicast
   group and info about the desired network interface.
   The indices of active network interfaces can be shown using the utility
   procan().
label(OPTION_IPV6_JOIN_SOURCE_GROUP)
dit(bf(tt(ipv6-join-source-group=<multicast-address:interface-name:source-address>)))
dit(bf(tt(ipv6-join-source-group=<multicast-address:interface-index:source-address>)))
   Makes the socket member of the specified multicast group for the
   specified source, i.e. only multicast traffic from this address is to be
   delivered. This only works for IPv6, see
   link(ip-add-source-membership)(OPTION_IP_ADD_SOURCE_MEMBERSHIP) for the
   IPv4 variant. The option takes the IP address of the multicast group,
   info about the desired network interface and the source IP address of the
   multicast traffic. The indices of active network interfaces can be shown
   using the utility procan().
label(OPTION_IP_MULTICAST_IF)
dit(bf(tt(ip-multicast-if=<hostname>)))
   Specifies hostname or address of the network interface to be used for
   multicast traffic.
label(OPTION_IP_MULTICAST_LOOP)
dit(bf(tt(ip-multicast-loop[=<bool>])))
   Specifies if outgoing multicast traffic should loop back to the interface.
label(OPTION_IP_MULTICAST_TTL)
dit(bf(tt(ip-multicast-ttl=<byte>)))
   Sets the TTL used for outgoing multicast traffic. Default is 1.
label(OPTOIN_IP_TRANSPARENT)
dit(bf(tt(ip-transparent)))
   Sets the IP_TRANSPARENT socket option.
   This option might require root privilege.
enddit()

startdit()enddit()nl()

label(OPTIONS_RESOLVER)em(bf(Resolver options))

These options temporarily change the behaviour of hostname resolution. The
options of form code(ai-*) affect behaviour of the code(getaddrinfo()) function that
includes code(/etc/hosts) and NIS based lookups.

The addresses of form code(res-*) only affect DNS lookups, and only when the
result is not cached in code(nscd). These options might not work on all
operating systems or libc implementations.

startdit()
label(OPTION_AI_ADDRCONFIG)
dit(bf(tt(ai-addrconfig[=0|1]))) dit(bf(tt(addrconfig[=0|1])))
   Sets or unsets the AI_ADDRCONFIG flag to prevent name resolution to address
   families that are not available on the computer (e.g. IPv6). Default value
   is 1 in case the resolver does not get an address family hint from Socat
   address or defaults.
label(OPTION_AI_PASSIVE)
dit(bf(tt(ai-passive[=0|1]))) dit(bf(tt(passive[=0|1])))
   Sets of unsets the AI_PASSIVE flag for code(getaddrinfo()) calls.
   Default is 1 for LISTEN, RECV, and RECVFROM type addresses, and with
   link(bind)(OPTION_BIND) option. 
label(OPTION_AI_V4MAPPED)
dit(bf(tt(ai-v4mapped[=0|1]))) dit(bf(tt(v4mapped[=0|1])))
   Sets or unsets the AI_V4MAPPED flag for code(getaddrinfo()). With socat()
   addresses requiring IPv6 addresses, this resolves IPv4 addresses to the
   approriate IPv6 address [::ffff:*:*]. For IPv6 Socat addresses, the default
   is 1.

label(OPTION_RES_DEBUG)dit(bf(tt(res-debug)))
label(OPTION_RES_AAONLY)dit(bf(tt(res-aaonly)))
label(OPTION_RES_USEVC)dit(bf(tt(res-usevc)))
label(OPTION_RES_PRIMARY)dit(bf(tt(res-primary)))
label(OPTION_RES_IGNTC)dit(bf(tt(res-igntc)))
label(OPTION_RES_RECURSE)dit(bf(tt(res-recurse)))
label(OPTION_RES_DEFNAMES)dit(bf(tt(res-defnames)))
label(OPTION_RES_STAYOPEN)dit(bf(tt(res-stayopen)))
label(OPTION_RES_DNSRCH)dit(bf(tt(res-dnsrch)))
   These options set the corresponding resolver (name resolution) option flags.
   Append "=0" to clear a default option. See man NOEXPAND(resolver(5)) for
   more information on these options. Socat() restores the old values after
   finishing the open phase of the address, so these options are valid just for
   the address they are applied to.nl()
   Please note that these flags only affect DNS resolution, but not hosts or
   NIS based name resolution, and they have no effect when (g)libc retrieves
   the results from code(nscd).
label(OPTION_RES_RETRANS)dit(bf(tt(res-retrans=<int>)))
   Sets the retransmission time interval of the DNS resolver (based on an
   undocumented feature).
label(OPTION_RES_RETRY)dit(bf(tt(res-retry=<int>)))
   Sets the number of retransmits of the DNS resolver (based on an undocumented
   feature).
label(OPTION_RES_NSADDR)dit(bf(tt(res-nsaddr=<ipaddr>[:<port>])))
   Tries to overwrite nameserver settings loaded from /etc/resolv.conf by
   writing the given IPv4 address into the undocumented
   code(_res:nsaddr_list[0]) field.
   code(/etc/hosts) is still checked by resolver. Please note that glibc's
   code(nscd) is always queried first when it is running!
enddit()

startdit()enddit()nl()


label(GROUP_IP6)em(bf(IP6 option group))

These options can only be used on IPv6 based sockets. See link(IP
options)(GROUP_IP) for options that can be applied to both IPv4 and IPv6
sockets.
startdit()
label(OPTION_IPV6_V6ONLY)dit(bf(tt(ipv6only[=<bool>])))
   Sets the IPV6_V6ONLY socket option. If 0, the TCP stack will also accept
   connections using IPv4 protocol on the same port. The default is system
   dependent.
label(OPTION_IPV6_RECVDSTOPTS)dit(bf(tt(ipv6-recvdstopts)))
   Sets the IPV6_RECVDSTOPTS socket option. This enables receiving and logging
   of ancillary messages containing the destination options.
label(OPTION_IPV6_RECVHOPLIMIT)dit(bf(tt(ipv6-recvhoplimit)))
   Sets the IPV6_RECVHOPLIMIT socket option. This enables receiving and logging
   of ancillary messages containing the hoplimit.
label(OPTION_IPV6_RECVHOPOPTS)dit(bf(tt(ipv6-recvhopopts)))
   Sets the IPV6_RECVHOPOPTS socket option. This enables receiving and logging
   of ancillary messages containing the hop options.
label(OPTION_IPV6_RECVPKTINFO)dit(bf(tt(ipv6-recvpktinfo)))
   Sets the IPV6_RECVPKTINFO socket option. This enables receiving and logging
   of ancillary messages containing destination address and interface.
label(OPTION_IPV6_UNICAST_HOPS)dit(bf(tt(ipv6-unicast-hops=link(TYPE_INT)(<int>))))
   Sets the IPV6_UNICAST_HOPS socket option. This sets the hop count limit
   (TTL) for outgoing unicast packets.
label(OPTION_IPV6_RECVRTHDR)dit(bf(tt(ipv6-recvrthdr)))
   Sets the IPV6_RECVRTHDR socket option. This enables receiving and logging
   of ancillary messages containing routing information.
label(OPTION_IPV6_TCLASS)dit(bf(tt(ipv6-tclass)))
   Sets the IPV6_TCLASS socket option. This sets the transfer class of outgoing
   packets.
label(OPTION_IPV6_RECVTCLASS)dit(bf(tt(ipv6-recvtclass)))
   Sets the IPV6_RECVTCLASS socket option. This enables receiving and logging
   of ancillary messages containing the transfer class.
enddit()

startdit()enddit()nl()


label(GROUP_TCP)em(bf(TCP option group))

These options may be applied to TCP sockets. They work by invoking code(setsockopt()) with the appropriate parameters.
startdit()
label(OPTION_TCP_CORK)dit(bf(tt(cork)))
   Doesn't send packets smaller than MSS (maximal segment size).
label(OPTION_DEFER-ACCEPT)dit(bf(tt(defer-accept)))
   While listening, accepts connections only when data from the peer arrived.
label(OPTION_KEEPCNT)dit(bf(tt(keepcnt=<count>)))
   Sets the number of keepalives before shutting down the socket to
   <count> [link(int)(TYPE_INT)].
label(OPTION_KEEPIDLE)dit(bf(tt(keepidle=<seconds>)))
   Sets the idle time before sending the first keepalive to <seconds>
   [link(int)(TYPE_INT)].
label(OPTION_KEEPINTVL)dit(bf(tt(keepintvl=<seconds>)))
   Sets the interval between two keepalives to <seconds>
   [link(int)(TYPE_INT)]. 
label(OPTION_LINGER2)dit(bf(tt(linger2=<seconds>)))
   Sets the time to keep the socket in FIN-WAIT-2 state to <seconds>
   [link(int)(TYPE_INT)].
label(OPTION_MSS)dit(bf(tt(mss=<bytes>)))
   Sets the MSS (maximum segment size) after the code(socket()) call to <bytes>
   [link(int)(TYPE_INT)]. This
   value is then proposed to the peer with the SYN or SYN/ACK packet
   (link(example)(EXAMPLE_OPTION_MSS)). 
label(OPTION_MSS_LATE)dit(bf(tt(mss-late=<bytes>)))
   Sets the MSS of the socket after connection has been established to <bytes>
   [link(int)(TYPE_INT)].
label(OPTION_TCP_NODELAY)dit(bf(tt(nodelay)))
   Turns off the Nagle algorithm for measuring the RTT (round trip time).
label(OPTION_RFC1323)dit(bf(tt(rfc1323)))
   Enables RFC1323 TCP options: TCP window scale, round-trip time measurement
   (RTTM), and protect against wrapped sequence numbers (PAWS) (AIX).
label(OPTION_STDURG)dit(bf(tt(stdurg)))
   Enables RFC1122 compliant urgent pointer handling (AIX).
label(OPTION_SYNCNT)dit(bf(tt(syncnt=<count>)))
   Sets the maximal number of SYN retransmits during connect to <count>
   [link(int)(TYPE_INT)].
COMMENT(label(OPTION_INFO)dit(bf(tt(info)))
   Tries to set the read-only TCP_INFO socket option.)
COMMENT(label(OPTION_WINDOW_CLAMP)dit(bf(tt(window-clamp)))
   Sets the TCP_WINDOW_CLAMP socket option.)
label(OPTION_TCP_MD5SIG)dit(bf(tt(md5sig)))
   Enables generation of MD5 digests on the packets (FreeBSD).
label(OPTION_TCP_NOOPT)dit(bf(tt(noopt)))
   Disables use of TCP options (FreeBSD, MacOSX).
label(OPTION_TCP_NOPUSH)dit(bf(tt(nopush)))
   sets the TCP_NOPUSH socket option (FreeBSD, MacOSX).
label(OPTION_TCP_SACK_DISABLE)dit(bf(tt(sack-disable)))
   Disables use the selective acknowledge feature (OpenBSD).
label(OPTION_TCP_SIGNATURE_ENABLE)dit(bf(tt(signature-enable)))
   Enables generation of MD5 digests on the packets (OpenBSD).
label(OPTION_TCP_ABORT_THRESHOLD)dit(bf(tt(abort-threshold=<milliseconds>)))
   Sets the time to wait for an answer of the peer on an established connection
   (HP-UX).
label(OPTION_TCP_CONN_ABORT_THRESHOLD)dit(bf(tt(conn-abort-threshold=<milliseconds>)))
   Sets the time to wait for an answer of the server during the initial connect
   (HP-UX).
label(OPTION_TCP_KEEPINIT)dit(bf(tt(keepinit)))
   Sets the time to wait for an answer of the server during NOEXPAND(connect()) before
   giving up. Value in half seconds, default is 150 (75s) (Tru64).
label(OPTION_TCP_PAWS)dit(bf(tt(paws)))
   Enables the "protect against wrapped sequence numbers" feature (Tru64).
label(OPTION_TCP_SACKENA)dit(bf(tt(sackena)))
   Enables selective acknowledge (Tru64).
label(OPTION_TCP_TSOPTENA)dit(bf(tt(tsoptena)))
   Enables the time stamp option that allows RTT recalculation on existing
   connections (Tru64).
enddit()

startdit()enddit()nl()


label(GROUP_UDP)em(bf(UDP option group))

This option may be applied to UDP datagram sockets.

startdit()
label(OPTION_UDP_IGNORE_PEERPORT)dit(bf(tt(udp-ignore-peerport>)))
   Address UDP-DATAGRAM expects incoming responses to come from the port
   specified in its second parameter. With this option, it accepts packets
   coming from any port.
enddit()

startdit()enddit()nl()


label(GROUP_SCTP)em(bf(SCTP option group))

These options may be applied to SCTP stream sockets.
startdit()
label(OPTION_SCTP_NODELAY)dit(bf(tt(sctp-nodelay)))
   Sets the SCTP_NODELAY socket option that disables the Nagle algorithm.
label(OPTION_SCTP_MAXSEG)dit(bf(tt(sctp-maxseg=<bytes>)))
   Sets the SCTP_MAXSEG socket option to <bytes> [link(int)(TYPE_INT)].  This
   value is then proposed to the peer with the SYN or SYN/ACK packet. 
enddit()

startdit()enddit()nl()


em(bf(UDP, TCP, and SCTP option group))

Here we find options that are related to the network port mechanism and thus
can be used with UDP, TCP, and SCTP client and server addresses.
startdit()
label(OPTION_SOURCEPORT)dit(bf(tt(sourceport=<port>)))
   For outgoing (client) TCP and UDP connections, it sets the source
   link(<port>)(TYPE_PORT) using an extra code(bind()) call.
   With TCP or UDP listen addresses, socat immediately shuts down the
   connection if the client does not use this sourceport. UDP-RECV,
   UDP-RECVFROM, UDP-SENDTO, and UDP-DATAGRAM addresses ignore the packet when
   it does not match.
   (link(example)(EXAMPLE_OPTION_SOURCEPORT)).
label(OPTION_LOWPORT)dit(bf(tt(lowport)))
   Outgoing (client) TCP and UDP connections with this option use
   an unused random source port between 640 and 1023 incl. On UNIX class operating
   systems, this requires root privilege, and thus indicates that the
   client process is authorized by local root.
   TCP and UDP listen addresses with this option immediately shut down the
   connection if the client does not use a sourceport <= 1023.
   This mechanism can provide limited authorization under some circumstances.
enddit()

startdit()enddit()nl()


label(GROUP_SOCKS)em(bf(SOCKS option group))

When using SOCKS type addresses, some socks specific options can be set.
startdit()
label(OPTION_SOCKSPORT)dit(bf(tt(socksport=<tcp service>)))
   Overrides the default "socks" service or port 1080 for the socks server
   port with link(<TCP service>)(TYPE_TCP_SERVICE).
label(OPTION_SOCKSUSER)dit(bf(tt(socksuser=<user>)))
   Sends the <user> [link(string)(TYPE_STRING)] in the username field to the
   socks server. Default is the actual user name ($LOGNAME or $USER) (link(example)(EXAMPLE_OPTION_SOCKSUSER)).
enddit()

startdit()enddit()nl()


label(GROUP_HTTP)em(bf(HTTP option group))

Options that can be provided with HTTP type addresses. The only HTTP address
currently implemented is link(proxy-connect)(ADDRESS_PROXY_CONNECT).

startdit()
label(OPTION_HTTP_VERSION)dit(bf(tt(http-version=<string>)))
   Changes the default "1.0" that is sent to the server in the initial HTTP
   request. Currently it has not other effect, in particular it does not
   provide any means to send a Host header.
label(OPTION_PROXYPORT)dit(bf(tt(proxyport=<TCP service>)))
   Overrides the default HTTP proxy port 8080 with
   link(<TCP service>)(TYPE_TCP_SERVICE).
label(OPTION_IGNORECR)dit(bf(tt(ignorecr)))
   The HTTP protocol requires the use of CR+NL as line terminator. When a proxy
   server violates this standard, socat might not understand its answer. 
   This option directs socat to interprete NL as line terminator and
   to ignore CR in the answer. Nevertheless, socat sends CR+NL to the proxy.
label(OPTION_PROXY_AUTHORIZATION)dit(bf(tt(proxy-authorization=<username>:<password>)))
   Provide "basic" authentication to the proxy server. The argument to the
   option is used with a "Proxy-Authorization: Basic" header in base64 encoded
   form.nl() 
   Note: username and password are visible for every user on the local machine
   in the process list; username and password are transferred to the proxy
   server unencrypted (base64 encoded) and might be sniffed.
label(OPTION_PROXY_AUTHORIZATION_FILE)dit(bf(tt(proxy-authorization-file=<filename>)))
   Like option link(proxy-authorization)(OPTION_PROXY_AUTHORIZATION), but the
   credentials are read from the file and therefore not visible in the process
   list.nl() 
label(OPTION_PROXY_RESOLVE)dit(bf(tt(resolve)))
   Per default, socat sends to the proxy a CONNECT request containing the
   target hostname. With this option, socat resolves the hostname locally and
   sends the IP address. Please note that, according to RFC 2396, only name
   resolution to IPv4 addresses is implemented.
enddit()

startdit()enddit()nl()


label(GROUP_RANGE)em(bf(RANGE option group))

These options check if a connecting client should be granted access. They can
be applied to listening and receiving network sockets. tcp-wrappers options
fall into this group.
startdit()
label(OPTION_RANGE)dit(bf(tt(range=<address-range>)))
   After accepting a connection, tests if the peer is within em(range). For
   IPv4 addresses, address-range takes the form address/bits, e.g.
   10.0.0.0/8, or address:mask, e.g. 10.0.0.0:255.0.0.0 (link(example)(EXAMPLE_OPTION_RANGE)); for IPv6, it is [ip6-address]/bits, e.g. [::1]/128.
   If the client address does not match, socat() refuses the connection attempt, issues a warning, and keeps
   listening/receiving.
label(OPTION_TCPWRAPPERS)dit(bf(tt(tcpwrap[=<name>])))
   Uses Wietse Venema's libwrap (tcpd) library to determine
   if the client is allowed to connect. The configuration files are
   /etc/hosts.allow and /etc/hosts.deny per default, see "man 5 hosts_access"
   for more information. The optional <name> (type link(string)(TYPE_STRING))
   is passed to the wrapper functions as daemon process name (link(example)(EXAMPLE_OPTION_TCPWRAPPERS)). 
   If omitted, the basename of socats invocation (argv[0]) is passed. 
   If both tcpwrap and range options are applied to an address, both
   conditions must be fulfilled to allow the connection.
label(OPTION_TCPWRAP_HOSTS_ALLOW_TABLE)dit(bf(tt(allow-table=<filename>)))
   Takes the specified file instead of /etc/hosts.allow.
label(OPTION_TCPWRAP_HOSTS_DENY_TABLE)dit(bf(tt(deny-table=<filename>)))
   Takes the specified file instead of /etc/hosts.deny.
label(OPTION_TCPWRAP_ETC)dit(bf(tt(tcpwrap-etc=<directoryname>)))
   Looks for hosts.allow and hosts.deny in the specified directory. Is
   overridden by options link(hosts-allow)(OPTION_TCPWRAP_HOSTS_ALLOW_TABLE)
   and link(hosts-deny)(OPTION_TCPWRAP_HOSTS_DENY_TABLE).
enddit()

startdit()enddit()nl()


label(GROUP_LISTEN)em(bf(LISTEN option group))

Options specific to listening sockets.
startdit()
label(OPTION_BACKLOG)dit(bf(tt(backlog=<count>)))
   Sets the backlog value passed with the code(listen()) system call to <count>
   [link(int)(TYPE_INT)]. Default is 5. 
label(OPTION_ACCEPT_TIMEOUT)dit(bf(tt(accept-timeout=<seconds>)))
   End waiting for a connection after <seconds> [link(timeval)(TYPE_TIMEVAL)]
   with error status.
enddit()

startdit()enddit()nl()


label(GROUP_CHILD)em(bf(CHILD option group))

Addresses of LISTEN and CONNECT type take the
link(fork)(OPTION_FORK) option to handle multiple connections via child
processes.
startdit()
label(OPTION_FORK)dit(bf(tt(fork)))
   After establishing a connection, handles its channel in a child process and
   keeps the parent process attempting to produce more connections, either by
   listening or by connecting in a loop (link(example)(EXAMPLE_OPTION_FORK)).nl()
   OPENSSL-CONNECT and OPENSSL-LISTEN differ in when they actually fork off the
   child:
   OPENSSL-LISTEN forks em(before) the SSL handshake, while OPENSSL-CONNECT
   forks em(afterwards).
   link(retry)(OPTION_RETRY) and link(forever)(OPTION_FOREVER) options are not
   inherited by the child process.nl()
   On some operating systems (e.g. FreeBSD) this option does not work for
   UDP-LISTEN addresses.nl()
label(OPTION_MAX_CHILDREN)dit(bf(tt(max-children=<count>)))
   Limits the number of concurrent child processes [link(int)(TYPE_INT)].
   Default is no limit.
label(OPTION_CHILDRED_SHUTUP)dit(bf(tt(children-shutup[=1|2|..])))
   Decreases the severity of log messages produced by child processes. For
   example, with value 1 notices are logged as info (or dropped depending on
   link(option -dX)(option_d)), and errors are logged as warnings but still
   cause termination of the child process.nl()
   This option is intended to reduce logging of high volume servers or
   proxies.nl()
   This option succeeds link(option cool-write)(OPTION_COOL_WRITE).
enddit()

startdit()enddit()nl()


label(GROUP_EXEC)em(bf(EXEC option group))

Options for addresses that invoke a program.
startdit()
label(OPTION_PATH)dit(bf(tt(path=<string>)))
   Overrides the PATH environment variable for searching the program with
   link(<string>)(TYPE_STRING). This
   code($PATH) value is effective in the child process too.
label(OPTION_LOGIN)dit(bf(tt(login)))
   Prefixes code(argv[0]) for the code(execvp()) call with '-', thus making a
   shell behave as login shell.
enddit()

startdit()enddit()nl()


label(GROUP_FORK)em(bf(FORK option group))

EXEC or SYSTEM addresses invoke a program using a child process and transfer data between socat() and the program. The interprocess communication mechanism can be influenced with the following options. Per
default, a code(socketpair()) is created and assigned to stdin and stdout of
the child process, while stderr is inherited from the socat() process, and the
child process uses file descriptors 0 and 1 for communicating with the main
socat process.
startdit()
label(OPTION_NOFORK)dit(bf(tt(nofork)))
   Does not fork a subprocess for executing the program, instead calls NOEXPAND(execvp())
   or NOEXPAND(system()) directly from the actual socat instance. This avoids the
   overhead of another process between the program and its peer,
   but introduces a lot of restrictions:
   startit()
   it() this option can only be applied to the second socat() address.
   it() it cannot be applied to a part of a link(dual)(ADDRESS_DUAL) address.
   it() the first socat address cannot be OPENSSL or READLINE
   it() socat options -b, -t, -D, -l, -v, -x become useless
   it() for both addresses, options ignoreeof, cr, and crnl become useless
   it() for the second address (the one with option nofork), options 
      append, metaCOMMENT(async,) cloexec, flock, user, group, mode, nonblock,
      perm-late, setlk, and setpgid cannot be applied. Some of these could be
      used on the first address though.
   endit()
label(OPTION_PIPES)dit(bf(tt(pipes)))
   Creates a pair of unnamed pipes for interprocess communication instead of a
   socket pair.
label(OPTION_OPENPTY)dit(bf(tt(openpty)))
   Establishes communication with the sub process using a pseudo terminal
   created with code(openpty()) instead of the default (socketpair or ptmx).
label(OPTION_PTMX)dit(bf(tt(ptmx)))
   Establishes communication with the sub process using a pseudo terminal
   created by opening file(/dev/ptmx) or file(/dev/ptc) instead of the default
   (socketpair).
label(OPTION_PTY)dit(bf(tt(pty)))
   Establishes communication with the sub process using a pseudo terminal
   instead of a socket pair. Creates the pty with an available mechanism. If
   openpty and ptmx are both available, it uses ptmx because this is POSIX
   compliant (link(example)(EXAMPLE_OPTION_PTY)).
label(OPTION_CTTY)dit(bf(tt(ctty)))
   Makes the pty the controlling tty of the sub process (link(example)(EXAMPLE_OPTION_CTTY)).
label(OPTION_STDERR)dit(bf(tt(stderr)))
   Directs stderr of the sub process to its output channel by making stderr a
   code(dup()) of stdout (link(example)(EXAMPLE_OPTION_STDERR)). 
label(OPTION_FDIN)dit(bf(tt(fdin=<fdnum>)))
   Assigns the sub processes input channel to its file descriptor
   link(<fdnum>)(TYPE_FDNUM) 
   instead of stdin (0). The program started from the subprocess has to use
   this fd for reading data from socat() (link(example)(EXAMPLE_OPTION_FDIN)). 
label(OPTION_FDOUT)dit(bf(tt(fdout=<fdnum>)))
   Assigns the sub processes output channel to its file descriptor
   link(<fdnum>)(TYPE_FDNUM) 
   instead of stdout (1). The program started from the subprocess has to use 
   this fd for writing data to socat() (link(example)(EXAMPLE_OPTION_FDOUT)).
label(OPTION_SIGHUP)label(OPTION_SIGINT)label(OPTION_SIGQUIT)dit(bf(tt(sighup)), bf(tt(sigint)), bf(tt(sigquit)))
   Has socat() pass signals of this type to the sub process.
   If no address has this option, socat terminates on these signals.
enddit()

startdit()enddit()nl()


label(GROUP_SHELL)

Options for link(address SHELL)(ADDRESS_SHELL)

startdit()
label(OPTION_SHELL)dit(bf(tt(shell=<filename>)))
   Overwrites use the default shell with the named executable, e.g.
   tt(/bin/dash). Also sets the tt(SHELL) environment variable.

enddit()

startdit()enddit()nl()


label(GROUP_TERMIOS)em(bf(TERMIOS option group))

For addresses that work on a tty (e.g., stdio, file:/dev/tty, exec:...,pty), the terminal parameters defined in the unix() termios mechanism are made available as address option parameters.
Please note that changes of the parameters of your interactive terminal 
remain effective after socat()'s termination, so you might have to enter "reset"
or "stty sane" in your shell afterwards.
For EXEC and SYSTEM addresses with option PTY,
these options apply to the pty by the child processes.

startdit()
label(OPTION_B0)dit(bf(tt(b0)))
   Disconnects the terminal.
label(OPTION_B19200)dit(bf(tt(b19200)))
   Sets the serial line speed to 19200 baud. Some other rates are possible; use
something like tt(socat -hh |grep ' b[1-9]') to find all speeds supported by
your implementation.nl()
Note: On some operating systems, these options may not be
available. Use link(ispeed)(OPTION_ISPEED) or link(ospeed)(OPTION_OSPEED)
instead.
label(OPTION_ECHO)dit(bf(tt(echo[=<bool>])))
   Enables or disables local echo.
label(OPTION_ICANON)dit(bf(tt(icanon[=<bool>])))
   Sets or clears canonical mode, enabling line buffering and some special
   characters. 
label(OPTION_RAW)dit(bf(tt(raw)))
   Sets raw mode, thus passing input and output almost unprocessed. This option is obsolete, use option link(rawer)(OPTION_TERMIOS_RAWER) or link(cfmakeraw)(OPTION_TERMIOS_CFMAKERAW) instead.
label(OPTION_TERMIOS_RAWER)dit(bf(tt(rawer)))
   Makes terminal rawer than link(raw)(OPTION_RAW) option. This option implicitly turns off echo. (link(example)(EXAMPLE_OPTION_TERMIOS_RAWER)).
label(OPTION_TERMIOS_CFMAKERAW)dit(bf(tt(cfmakeraw)))
   Sets raw mode by invoking tt(cfmakeraw()) or by simulating this call. This option implicitly turns off echo.
label(OPTION_IGNBRK)dit(bf(tt(ignbrk[=<bool>])))
   Ignores or interpretes the BREAK character (e.g., ^C)
label(OPTION_BRKINT)dit(bf(tt(brkint[=<bool>])))
label(OPTION_BS0)dit(bf(tt(bs0)))
label(OPTION_BS1)dit(bf(tt(bs1)))
label(OPTION_BSDLY)dit(bf(tt(bsdly=<0|1>)))
label(OPTION_CLOCAL)dit(bf(tt(clocal[=<bool>])))

label(OPTION_CR0)label(OPTION_CR1)label(OPTION_CR2)label(OPTION_CR3)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBcr0
cr1
cr2
cr3\fP)
mancommand(\.fi)
mancommand(\.IP)
htmlcommand(<dt><code><strong>cr0</strong><br>
<strong>cr1</strong><br>
<strong>cr2</strong><br>
<strong>cr3</strong></code><dd>)
   Sets the carriage return delay to 0, 1, 2, or 3, respectively.
   0 means no delay, the other values are terminal dependent.

label(OPTION_CRDLY)dit(bf(tt(crdly=<0|1|2|3>)))
label(OPTION_CREAD)dit(bf(tt(cread[=<bool>])))
label(OPTION_CRTSCTS)dit(bf(tt(crtscts[=<bool>])))

label(OPTION_CS5)label(OPTION_CS6)label(OPTION_CS7)label(OPTION_CS8)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBcs5 
cs6 
cs7 
cs8\fP)
mancommand(\.fi)
mancommand(\.IP)
htmlcommand(<dt><code><strong>cs5</strong><br>
<strong>cs6</strong><br>
<strong>cs7</strong><br>
<strong>cs8</strong></code><dd>)
   Sets the character size to 5, 6, 7, or 8 bits, respectively.

label(OPTION_CSIZE)dit(bf(tt(csize=<0|1|2|3>)))
label(OPTION_CSTOPB)dit(bf(tt(cstopb[=<bool>])))
   Sets two stop bits, rather than one.
label(OPTION_VDSUSP)dit(bf(tt(dsusp=<byte>)))
   Sets the value for the VDSUSP character that suspends the current foreground
   process and reactivates the shell (all except Linux).
label(OPTION_ECHOCTL)dit(bf(tt(echoctl[=<bool>])))
   Echos control characters in hat notation (e.g. ^A)
label(OPTION_ECHOE)dit(bf(tt(echoe[=<bool>])))
label(OPTION_ECHOK)dit(bf(tt(echok[=<bool>])))
label(OPTION_ECHOKE)dit(bf(tt(echoke[=<bool>])))
label(OPTION_ECHONL)dit(bf(tt(echonl[=<bool>])))
label(OPTION_ECHOPRT)dit(bf(tt(echoprt[=<bool>])))
label(OPTION_EOF)dit(bf(tt(eof=<byte>)))
label(OPTION_EOL)dit(bf(tt(eol=<byte>)))
label(OPTION_EOL2)dit(bf(tt(eol2=<byte>)))
label(OPTION_ERASE)dit(bf(tt(erase=<byte>)))
label(OPTION_DISCARD)dit(bf(tt(discard=<byte>)))
label(OPTION_FF0)dit(bf(tt(ff0)))
label(OPTION_FF1)dit(bf(tt(ff1)))
label(OPTION_FFDLY)dit(bf(tt(ffdly[=<bool>])))
label(OPTION_FLUSHO)dit(bf(tt(flusho[=<bool>])))
label(OPTION_HUPCL)dit(bf(tt(hupcl[=<bool>])))
label(OPTION_ICRNL)dit(bf(tt(icrnl[=<bool>])))
label(OPTION_IEXTEN)dit(bf(tt(iexten[=<bool>])))
label(OPTION_IGNCR)dit(bf(tt(igncr[=<bool>])))
label(OPTION_IGNPAR)dit(bf(tt(ignpar[=<bool>])))
label(OPTION_IMAXBEL)dit(bf(tt(imaxbel[=<bool>])))
label(OPTION_INLCR)dit(bf(tt(inlcr[=<bool>])))
label(OPTION_INPCK)dit(bf(tt(inpck[=<bool>])))
label(OPTION_INTR)dit(bf(tt(intr=<byte>)))
label(OPTION_ISIG)dit(bf(tt(isig[=<bool>])))
label(OPTION_ISPEED)dit(bf(tt(ispeed=<unsigned-int>)))
   Set the baud rate for incoming data on this line.nl()
   See also: link(ospeed)(OPTION_OSPEED), link(b19200)(OPTION_B19200)
label(OPTION_ISTRIP)dit(bf(tt(istrip[=<bool>])))
label(OPTION_IUCLC)dit(bf(tt(iuclc[=<bool>])))
label(OPTION_IXANY)dit(bf(tt(ixany[=<bool>])))
label(OPTION_IXOFF)dit(bf(tt(ixoff[=<bool>])))
label(OPTION_IXON)dit(bf(tt(ixon[=<bool>])))
label(OPTION_KILL)dit(bf(tt(kill=<byte>)))
label(OPTION_LNEXT)dit(bf(tt(lnext=<byte>)))
label(OPTION_MIN)dit(bf(tt(min=<byte>)))
label(OPTION_NL0)dit(bf(tt(nl0)))
   Sets the newline delay to 0.
label(OPTION_NL1)dit(bf(tt(nl1)))
label(OPTION_NLDLY)dit(bf(tt(nldly[=<bool>])))
label(OPTION_NOFLSH)dit(bf(tt(noflsh[=<bool>])))
label(OPTION_OCRNL)dit(bf(tt(ocrnl[=<bool>])))
label(OPTION_OFDEL)dit(bf(tt(ofdel[=<bool>])))
label(OPTION_OFILL)dit(bf(tt(ofill[=<bool>])))
label(OPTION_OLCUC)dit(bf(tt(olcuc[=<bool>])))
label(OPTION_ONLCR)dit(bf(tt(onlcr[=<bool>])))
label(OPTION_ONLRET)dit(bf(tt(onlret[=<bool>])))
label(OPTION_ONOCR)dit(bf(tt(onocr[=<bool>])))
label(OPTION_OPOST)dit(bf(tt(opost[=<bool>])))
   Enables or disables output processing; e.g., converts NL to CR-NL.
label(OPTION_OSPEED)dit(bf(tt(ospeed=<unsigned-int>)))
   Set the baud rate for outgoing data on this line.nl()
   See also: link(ispeed)(OPTION_ISPEED), link(b19200)(OPTION_B19200)
label(OPTION_PARENB)dit(bf(tt(parenb[=<bool>])))
   Enable parity generation on output and parity checking for input.
label(OPTION_PARMRK)dit(bf(tt(parmrk[=<bool>])))
label(OPTION_PARODD)dit(bf(tt(parodd[=<bool>])))
label(OPTION_PENDIN)dit(bf(tt(pendin[=<bool>])))
label(OPTION_QUIT)dit(bf(tt(quit=<byte>)))
label(OPTION_REPRINT)dit(bf(tt(reprint=<byte>)))
label(OPTION_SANE)dit(bf(tt(sane)))
   Brings the terminal to something like a useful default state.
label(OPTION_START)dit(bf(tt(start=<byte>)))
label(OPTION_STOP)dit(bf(tt(stop=<byte>)))
label(OPTION_SUSP)dit(bf(tt(susp=<byte>)))
label(OPTION_SWTC)dit(bf(tt(swtc=<byte>)))
label(OPTION_TAB0)dit(bf(tt(tab0)))
label(OPTION_TAB1)dit(bf(tt(tab1)))
label(OPTION_TAB2)dit(bf(tt(tab2)))
label(OPTION_TAB3)dit(bf(tt(tab3)))
label(OPTION_TABDLY)dit(bf(tt(tabdly=<unsigned-int>)))
label(OPTION_TIME)dit(bf(tt(time=<byte>)))
label(OPTION_TOSTOP)dit(bf(tt(tostop[=<bool>])))
label(OPTION_VT0)dit(bf(tt(vt0)))
label(OPTION_VT1)dit(bf(tt(vt1)))
label(OPTION_VTDLY)dit(bf(tt(vtdly[=<bool>])))
label(OPTION_WERASE)dit(bf(tt(werase=<byte>)))
label(OPTION_XCASE)dit(bf(tt(xcase[=<bool>])))
label(OPTION_XTABS)dit(bf(tt(xtabs)))
label(OPTION_I_POP_ALL)dit(bf(tt(i-pop-all)))
   With UNIX System V STREAMS, removes all drivers from the stack.
label(OPTION_I_PUSH)dit(bf(tt(i-push=<string>)))
   With UNIX System V STREAMS, pushes the driver (module) with the given name
   (link(string)(TYPE_STRING)) onto the stack. For example, to make sure that a
   character device on Solaris supports termios etc, use the following options:
   tt(i-pop-all,i-push=ptem,i-push=ldterm,i-push=ttcompat)
enddit()

startdit()enddit()nl()


label(GROUP_PTY)em(bf(PTY option group))

These options are intended for use with the link(pty)(ADDRESS_PTY) address
type.

startdit()
label(OPTION_SYMBOLIC_LINK)dit(bf(tt(link=<filename>)))
   Generates a symbolic link that points to the actual pseudo terminal
   (pty). This might help 
   to solve the problem that ptys are generated with more or less
   unpredictable names, making it difficult to directly access the socat
   generated pty automatically. With this option, the user can specify a "fix"
   point in the file hierarchy that helps him to access the actual pty
   (link(example)(EXAMPLE_OPTION_SYMBOLIC_LINK)).
   Beginning with socat() version 1.4.3, the symbolic link is removed when
   the address is closed (but see option link(unlink-close)(OPTION_UNLINK_CLOSE)).
label(OPTION_PTY_WAIT_SLAVE)dit(bf(tt(wait-slave)))
   Blocks the open phase until a process opens the slave side of the pty.
   Usually, socat continues after generating the pty with opening the next
   address or with entering the transfer loop. With the wait-slave option,
   socat waits until some process opens the slave side of the pty before
   continuing. 
   This option only works if the operating system provides the tt(poll())
   system call. And it depends on an undocumented behaviour of pty's, so it
   does not work on all operating systems. It has successfully been tested on
   Linux, FreeBSD, NetBSD, and on Tru64 with openpty. 
label(OPTION_PTY_INTERVAL)dit(bf(tt(pty-interval=<seconds>)))
   When the link(wait-slave)(OPTION_PTY_WAIT_SLAVE) option is set, socat
   periodically checks the HUP condition using tt(poll()) to find if the pty's
   slave side has been opened. The default polling interval is 1s. Use the
   pty-interval option [link(timeval)(TYPE_TIMEVAL)] to change this value.
label(OPTION_SITOUT_EIO)dit(bf(tt(sitout-eio=<timeval>)))
   The login program in Linux closes its tty/pty and reopens it for security
   reasons. During this time the pty master would get EIO on I/O operations and
   might terminate. With this option socat() tolerates EIO for the specified
   time. Please note that in this state socat() blocks traffic in both
   directions, even when it is not related to this channel.
enddit()


startdit()enddit()nl()


label(GROUP_OPENSSL)em(bf(OPENSSL option group))

These options apply to the link(openssl)(ADDRESS_OPENSSL_CONNECT) and
link(openssl-listen)(ADDRESS_OPENSSL_LISTEN) address types.

startdit()
label(OPTION_OPENSSL_CIPHERLIST)dit(bf(tt(cipher=<cipherlist>)))
   Specifies the list of ciphers that may be used for the connection.
   See the man page of code(ciphers), section bf(CIPHER LIST FORMAT), for
   detailed information about syntax, values, and default of <cipherlist>.nl()
   Several cipher strings may be given, separated by ':'.
   Some simple cipher strings:
   startdit()
   dit(3DES) Uses a cipher suite with triple DES.
   dit(MD5) Uses a cipher suite with MD5.
   dit(aNULL) Uses a cipher suite without authentication.
   dit(NULL) Does not use encryption.
   dit(HIGH) Uses a cipher suite with "high" encryption.
   enddit()
   Note that the peer must support the selected property, or the negotiation
   will fail.
label(OPTION_OPENSSL_METHOD)dit(bf(tt(method=<ssl-method>)))
   This option is based on deprecated functions and is only available when
   socat() was build with option tt(--with-openssl-method).
   Use option link(min-proto-version)(OPTION_OPENSSL_MIN_PROTO_VERSION)
   and maybe link(max-proto-version)(OPTION_OPENSSL_MAX_PROTO_VERSION)
   instead.
   Sets the protocol version to be used. Valid strings (not case sensitive)
   are:  
   startdit()
   dit(tt(SSL2)) Select SSL protocol version 2.
   dit(tt(SSL3)) Select SSL protocol version 3.
   dit(tt(SSL23)) Select the best available SSL or TLS protocol.
   dit(tt(TLS1)) Select TLS protocol version 1.
   dit(tt(TLS1.1)) Select TLS protocol version 1.1.
   dit(tt(TLS1.2)) Select TLS protocol version 1.2.
   When this option is not provided OpenSSL negotiates the mothod with its
   peer.
   enddit()
label(OPTION_OPENSSL_MIN_PROTO_VERSION)dit(bf(tt(min-proto-version)))
   This option tells OpenSSL to use this or a later SSL/TLS protocol version
   and refuses to accept a lower/older protocol. Valid syntax is:
   startdit()
   dit(tt(SSL2)) Select SSL protocol version 2.
   dit(tt(SSL3)) Select SSL protocol version 3.
   dit(tt(TLS1)) dit(tt(TLS1.0)) Select TLS protocol version 1.
   dit(tt(TLS1.1)) Select TLS protocol version 1.1.
   dit(tt(TLS1.2)) Select TLS protocol version 1.2.
   dit(tt(TLS1.3)) Select TLS protocol version 1.3.
   enddit()
label(OPTION_OPENSSL_MAX_PROTO_VERSION)dit(bf(tt(openssl-max-proto-version)))
   This option is similar to link(min-proto-version)(OPTION_OPENSSL_MIN_PROTO_VERSION),
   however, it disallows use of a higher protocol version. Useful for testing
   the peer.
label(OPTION_OPENSSL_VERIFY)dit(bf(tt(verify[=<bool>])))
   Controls check of the peer's certificate. Default is 1 (true). Disabling
   verify might open your socket for everyone, making the encryption useless!
label(OPTION_OPENSSL_CERTIFICATE)dit(bf(tt(cert=<filename>)))
   Specifies the file with the certificate and private key for authentication. 
   The certificate must be in OpenSSL format (*.pem). 
   With openssl-listen, use of this option is strongly
   recommended. Except with cipher aNULL, "no shared ciphers" error will
   occur when no certificate is given.
label(OPTION_OPENSSL_KEY)dit(bf(tt(key=<filename>)))
   Specifies the file with the private key. The private key may be in this
   file or in the file given with the link(cert)(OPTION_OPENSSL_CERTIFICATE) option. The party that has
   to proof that it is the owner of a certificate needs the private key.
label(OPTION_OPENSSL_DHPARAMS)dit(bf(tt(dhparams=<filename>)))
   Specifies the file with the Diffie Hellman parameters. These parameters may
   also be in the file given with the link(cert)(OPTION_OPENSSL_CERTIFICATE)
   option in which case the dhparams option is not needed.
label(OPTION_OPENSSL_CAFILE)dit(bf(tt(cafile=<filename>)))
   Specifies the file with the trusted (root) authority certificates. The file
   must be in PEM format and should contain one or more certificates. The party
   that checks the authentication of its peer trusts only certificates that are
   in this file.
label(OPTION_OPENSSL_CAPATH)dit(bf(tt(capath=<dirname>)))
   Specifies the directory with the trusted (root) certificates. The directory
   must contain certificates in PEM format and their hashes (see OpenSSL
   documentation) 
label(OPTION_OPENSSL_EGD)dit(bf(tt(egd=<filename>)))
   On some systems, openssl requires an explicit source of random data. Specify
   the socket name where an entropy gathering daemon like egd provides random
   data, e.g. /dev/egd-pool.
label(OPTION_OPENSSL_MAXFRAGLEN)dit(bf(tt(openssl-maxfraglen=<int>, maxfraglen=<int>)))
   For client connections, make a Max Fragment Length Negotiation Request to the server to limit the
   maximum size fragment the server will send to us. Supported lengths are: 512, 1024, 2048, or
   4096. Note that this option is not applicable for link(OPENSSL-LISTEN)(ADDRESS_OPENSSL_LISTEN).
label(OPTION_OPENSSL_MAXSENDFRAG)dit(bf(tt(openssl-maxsendfrag=<int>, maxsendfrag=<int>)))
   Limit the maximum size of the fragment we will send to the other side. Supported length range:
   512 - 16384. Note that under link(OPENSSL-LISTEN)(ADDRESS_OPENSSL_LISTEN), the maximum fragment
   size may be further limited by the client's Maximum Fragment Length Negotiation Request, if it
   makes one.
label(OPTION_OPENSSL_PSEUDO)dit(bf(tt(pseudo)))
   On systems where openssl cannot find an entropy source and where no entropy
   gathering daemon can be utilized, this option activates a mechanism for
   providing pseudo entropy. This is achieved by taking the current time in
   microseconds for feeding the libc pseudo random number generator with an
   initial value. openssl is then feeded with output from NOEXPAND(random()) calls.nl()
   NOTE:This mechanism is not sufficient for generation of secure keys!
label(OPTION_OPENSSL_COMPRESS)dit(bf(tt(compress)))
   Enable or disable the use of compression for a connection. Setting this to
   "none" disables compression, setting it to "auto" lets OpenSSL choose the best
   available algorithm supported by both parties. The default is to not touch any
   compression-related settings.
   NOTE: Requires OpenSSL 0.9.8 or higher and disabling compression with
   OpenSSL 0.9.8 affects all new connections in the process.
label(OPTION_OPENSSL_COMMONNAME)dit(bf(tt(commonname=<string>)))
   Specify the commonname that the peer certificate must match. With
   link(OPENSSL-CONNECT)(ADDRESS_OPENSSL_CONNECT) address this overrides the
   given hostname or IP target address; with
   link(OPENSSL-LISTEN)(ADDRESS_OPENSSL_LISTEN) this turns on check of peer
   certificates commonname. This option has only meaning when option
   link(verify)(OPTION_OPENSSL_VERIFY) is not disabled and the chosen cipher
   provides a peer certificate.
label(OPTION_OPENSSL_NO_SNI)dit(bf(tt(no-sni[=<bool>])))
   Do not use the client side Server Name Indication (SNI) feature that selects
   the desired server certificate.nl()
   Note: SNI is automatically used since socat() version 1.7.4.0 and uses
   link(commonname)(OPTION_OPENSSL_COMMONNAME) or the given host name.
label(OPTION_OPENSSL_SNIHOST)dit(bf(tt(snihost=<string>)))
   Set the client side Server Name Indication (SNI) host name different from
   the addressed server name or common name. This might be useful when the
   server certificate has multiple host names or wildcard names because the
   SNI host name is passed in cleartext to the server and might be eavesdropped;
   with this option a mock name of the desired certificate may be transferred.
label(OPTION_OPENSSL_FIPS)dit(bf(tt(fips)))
   Enables FIPS mode if compiled in. For info about the FIPS encryption
   implementation standard see lurl(http://oss-institute.org/fips-faq.html). 
   This mode might require that the involved certificates are generated with a
   FIPS enabled version of openssl. Setting or clearing this option on one
   socat address affects all OpenSSL addresses of this process.
enddit()

startdit()enddit()nl()


label(GROUP_RETRY)em(bf(RETRY option group))

Options that control retry of some system calls, especially connection
attempts.

startdit()
label(OPTION_RETRY)dit(bf(tt(retry=<num>)))
   Number of retries before the connection or listen attempt is aborted. 
   Default is 0, which means just one attempt. 
label(OPTION_INTERVAL)dit(bf(tt(interval=<timespec>)))
   Time between consecutive attempts (seconds, 
   [link(timespec)(TYPE_TIMESPEC)]). Default is 1 second.
label(OPTION_FOREVER)dit(bf(tt(forever)))
   Performs an unlimited number of retry attempts.
enddit()

startdit()enddit()nl()


label(GROUP_INTERFACE)em(bf(INTERFACE option group))

These options may be applied to addresses link(INTERFACE)(ADDRESS_INTERFACE) and
link(TUN)(ADDRESS_TUN). These address types and options are currently only
implemented on Linux operating system.

Note regarding VLANs: On incoming packets the Linux kernel strips off the VLAN
tag before passing the data to the user space program on raw sockets. Special
measures are required to get the VLAN information, see NOEXPAND(packet(7)) PACKET_AUXDATA,
and to optionally insert the tag into the packet again, use option
link(retrieve-vlan)(OPTION_RETRIEVE_VLAN) when you need this.

startdit()
label(OPTION_RETRIEVE_VLAN)dit(bf(tt(retrieve-vlan)))
   On packets incoming on raw sockets, retrieve the VLAN information and insert
   it into the packets for further processing (Linux)

label(OPTION_IFF_UP)dit(bf(tt(iff-up)))
   Sets the TUN network interface status UP. Strongly recommended.
label(OPTION_IFF_BROADCAST)dit(bf(tt(iff-broadcast)))
   Sets the BROADCAST flag of the TUN network interface.
label(OPTION_IFF_DEBUG)dit(bf(tt(iff-debug)))
   Sets the DEBUG flag of the TUN network interface.
label(OPTION_IFF_LOOPBACK)dit(bf(tt(iff-loopback)))
   Sets the LOOPBACK flag of the TUN network interface.
label(OPTION_IFF_POINTOPOINT)dit(bf(tt(iff-pointopoint)))
   Sets the POINTOPOINT flag of the TUN device.
label(OPTION_IFF_NOTRAILERS)dit(bf(tt(iff-notrailers)))
   Sets the NOTRAILERS flag of the TUN device.
label(OPTION_IFF_RUNNING)dit(bf(tt(iff-running)))
   Sets the RUNNING flag of the TUN device.
label(OPTION_IFF_NOARP)dit(bf(tt(iff-noarp)))
   Sets the NOARP flag of the TUN device.
label(OPTION_IFF_PROMISC)dit(bf(tt(iff-promisc)))
   Sets the PROMISC flag of the TUN device.
label(OPTION_IFF_ALLMULTI)dit(bf(tt(iff-allmulti)))
   Sets the ALLMULTI flag of the TUN device.
label(OPTION_IFF_MASTER)dit(bf(tt(iff-master)))
   Sets the MASTER flag of the TUN device.
label(OPTION_IFF_SLAVE)dit(bf(tt(iff-slave)))
   Sets the SLAVE flag of the TUN device.
label(OPTION_IFF_MULTICAST)dit(bf(tt(iff-multicast)))
   Sets the MULTICAST flag of the TUN device.
label(OPTION_IFFPORTSEL_)dit(bf(tt(iff-portsel)))
   Sets the PORTSEL flag of the TUN device.
label(OPTION_IFF_AUTOMEDIA)dit(bf(tt(iff-automedia)))
   Sets the AUTOMEDIA flag of the TUN device.
label(OPTION_IFF_DYNAMIC)dit(bf(tt(iff-dynamic)))
   Sets the DYNAMIC flag of the TUN device.
enddit()

startdit()enddit()nl()


label(GROUP_TUN)em(bf(TUN option group))

Options that control Linux TUN/TAP interface device addresses.

startdit()
label(OPTION_TUN_DEVICE)dit(bf(tt(tun-device=<device-file>)))
   Instructs socat to take another path for the TUN clone device. Default is
   tt(/dev/net/tun).
label(OPTION_TUN_NAME)dit(bf(tt(tun-name=<if-name>)))
   Gives the resulting network interface a specific name instead of the system
   generated (tun0, tun1, etc.)
label(OPTION_TUN_TYPE)dit(bf(tt(tun-type=[tun|tap])))
   Sets the type of the TUN device; use this option to generate a TAP
   device. See the Linux docu for the difference between these types.
   When you try to establish a tunnel between two TUN devices, their types
   should be the same.
label(OPTION_IFF_NO_PI)dit(bf(tt(iff-no-pi)))
   Sets the IFF_NO_PI flag which controls if the device includes additional
   packet information in the tunnel.
   When you try to establish a tunnel between two TUN devices, these flags
   should have the same values.
enddit()

startdit()enddit()nl()

label(GROUP_POSIXMQ)em(bf(POSIX-MQ option group))

Options that may be applied to POSIX-MQ addresses.

startdit()
label(OPTION_POSIXMQ_PRIORITY)dit(bf(tt(posixmq-priority (mq-prio))))
   Sets the priority of messages (packets) written to the queue, or the minimal
   priority of packet read from the queue.
enddit()


label(VALUES)
manpagesection(DATA VALUES)

This section explains the different data types that address parameters and
address options can take.

startdit()
label(TYPE_ADDRESS_RANGE)dit(address-range)
   Is currently only implemented for IPv4 and IPv6. See address-option
   link(`range')(OPTION_RANGE) 
label(TYPE_BOOL)dit(bool)
   "0" or "1"; if value is omitted, "1" is taken.
label(TYPE_BYTE)dit(byte)
   An unsigned int number, read with code(strtoul()), lower or equal to
   code(UCHAR_MAX).
label(TYPE_COMMAND_LINE)dit(command-line)
   A string specifying a program name and its arguments, separated by single
   spaces. 
label(TYPE_DATA)dit(data)
   This is a more general data specification. The given text string contains
   information about the target data type and value. Generally a leading
   character specifies the type of the following data item. In its specific
   context a default data type may exist.nl()
   Currently only the following specifications are implemented:nl()
   description(
   dit(i)  A signed integer number, stored in host byte order.nl()
   Example:    bf(i-1000)    (Integer number -1000)
   dit(I)  An unsigned integer number, stored in host byte order.nl()
   dit(l)  A signed long integer number, stored in host byte order.nl()
   dit(L)  An unsigned long integer number, stored in host byte order.nl()
   dit(s)  A signed short integer number, stored in host byte order.nl()
   dit(S)  An unsigned short integer number, stored in host byte order.nl()
   dit(b)  A signed byte (signed char).nl()
   dit(B)  An unsigned byte (unsigned char).nl()
   dit(x)  Following is an even number of hex digits, stored as sequence of
   bytes.nl()
   Example:    bf(x7f000001) (IP address 127.0.0.1)
   dit(")  Following is a string that is used with the common conversions 
   \n \r \t \f \b \a \e \0; the string must be closed with '"'. Please note
   that the quotes and backslashes need to be escaped from shell and socat()
   conversion.nl()
   Example:    bf("Hello world!\n")
   dit(')  A single char, with the usual conversions. Please note that the
   quotes and backslashes need to be escaped from shell and socat() conversion.
   nl()
   Example:    bf('a')
   )
   Data items may be separated with white space without need to repeat the type
   specifier again.
label(TYPE_DIRECTORY)dit(directory)
   A string with usual unix() directory name semantics.
label(TYPE_FACILITY)dit(facility)
   The name of a syslog facility in lower case characters.
label(TYPE_FDNUM)dit(fdnum)
   An unsigned int type, read with code(strtoul()), specifying a unix() file
   descriptor. 
label(TYPE_FILENAME)dit(filename)
   A string with usual unix() filename semantics.
label(TYPE_GROUP)dit(group)
   If the first character is a decimal digit, the value is read with
   code(strtoul()) as unsigned integer specifying a group id. Otherwise, it
   must be an existing group name.
label(TYPE_INT)dit(int)
   A number following the rules of the code(strtol()) function with base
   "0", i.e. decimal number, octal number with leading "0", or hexadecimal
   number with leading "0x". The value must fit into a C int.
label(TYPE_INTERFACE)dit(interface)
   A string specifying the device name of a network interface
   as shown by ifconfig or procan, e.g. "eth0".
label(TYPE_IP_ADDRESS)dit(IP address)
   An IPv4 address in numbers-and-dots notation, an IPv6 address in hex
   notation enclosed in brackets, or a hostname that resolves to an IPv4 or an
   IPv6 address.nl()
   Examples: 127.0.0.1, [::1], www.dest-unreach.org, dns1
label(TYPE_IPV4_ADDRESS)dit(IPv4 address)
   An IPv4 address in numbers-and-dots notation or a hostname that resolves to
   an IPv4 address.nl()
   Examples: 127.0.0.1, www.dest-unreach.org, dns2
label(TYPE_IPV6_ADDRESS)dit(IPv6 address)
   An IPv6 address in hexnumbers-and-colons notation enclosed in brackets, or a
   hostname that resolves to an IPv6 address.nl()
   Examples: [::1], [1234:5678:9abc:def0:1234:5678:9abc:def0],
   ip6name.domain.org 
label(TYPE_LONG)dit(long)
   A number read with code(strtol()). The value must fit into a C long.
label(TYPE_LONGLONG)dit(long long)
   A number read with code(strtoll()). The value must fit into a C long long.
label(TYPE_OFF)dit(off_t)
   An implementation dependend signed number, usually 32 bits, read with strtol
   or strtoll.
label(TYPE_OFF64)dit(off64_t)
   An implementation dependend signed number, usually 64 bits, read with strtol
   or strtoll.
label(TYPE_MODE_T)dit(mode_t)
   An unsigned integer, read with code(strtoul()), specifying mode (permission)
   bits. 
label(TYPE_PID_T)dit(pid_t)
   A number, read with code(strtol()), specifying a process id.
label(TYPE_PORT)dit(port)
   A uint16_t (16 bit unsigned number) specifying a TCP or UDP port, read
   with code(strtoul()).
label(TYPE_PROTOCOL)dit(protocol)
   An unsigned 8 bit number, read with code(strtoul()).
label(TYPE_SIZE_T)dit(size_t)
   An unsigned number with size_t limitations, read with code(strtoul).
label(TYPE_SOCKNAME)dit(sockname)
   A socket address. See address-option link(`bind')(OPTION_BIND)
label(TYPE_STRING)dit(string)
   A sequence of characters, not containing '\0' and, depending on
   the position within the command line, ':', ',', or "!!". Note
   that you might have to escape shell meta characters in the command line.
label(TYPE_TCP_SERVICE)dit(TCP service)
   A service name, not starting with a digit, that is resolved by
   code(getservbyname()), or an unsigned int 16 bit number read with
   code(strtoul()).
label(TYPE_TIMEVAL)dit(timeval)
   A double float specifying seconds; the number is mapped into a
   struct timeval, consisting of seconds and microseconds.
label(TYPE_TIMESPEC)dit(timespec)
   A double float specifying seconds; the number is mapped into a
   struct timespec, consisting of seconds and nanoseconds.
label(TYPE_UDP_SERVICE)dit(UDP service)
   A service name, not starting with a digit, that is resolved by
   code(getservbyname()), or an unsigned int 16 bit number read with
   code(strtoul()).
label(TYPE_UNSIGNED_INT)dit(unsigned int)
   A number read with code(strtoul()). The value must fit into a C unsigned
   int. 
label(TYPE_USER)dit(user)
   If the first character is a decimal digit, the value is read with
   code(strtoul()) as unsigned integer specifying a user id. Otherwise, it must
   be an existing user name.
label(TYPE_VSOCK_ADDRESS)dit(VSOCK cid)
   A uint32_t (32 bit unsigned number) specifying a VSOCK Context Identifier
   (CID), read with code(strtoul()).
   There are several special addresses: VMADDR_CID_ANY (-1U) means any address
   for binding; VMADDR_CID_HOST (2) is the well-known address of the host.
label(TYPE_VSOCK_PORT)dit(VSOCK port)
   A uint32_t (32 bit unsigned number) specifying a VSOCK port, read
   with code(strtoul()).
enddit()


label(EXAMPLES)
manpagesection(EXAMPLES)


startdit()

COMMENT(I could not find a way to have these multiline examples with yodl,
code() and verbatim() failed miserably...)
COMMENT(Thus this tedious hack for now)

label(EXAMPLE_ADDRESS_TCP4_CONNECT)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - TCP4:www.domain.org:80\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - TCP4:www.domain.org:80</div>)

transfers data between link(STDIO)(ADDRESS_STDIO) (-) and a
link(TCP4)(ADDRESS_TCP4_CONNECT) connection to port 80 of host 
www.domain.org. This example results in an interactive connection similar to
telnet or netcat. The stdin terminal parameters are not changed, so you may
close the relay with ^D or abort it with ^C.

label(EXAMPLE_ADDRESS_READLINE)
label(EXAMPLE_OPTION_HISTORY)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat -d -d \\)
mancommand(\.RS)
mancommand(\fBREADLINE,history=$HOME/.http_history \\ 
	TCP4:www.domain.org:www,crnl\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat -d -d &#x5C;
    READLINE,history=$HOME/.http_history &#x5C;
    TCP4:www.domain.org:www,crnl</div>)

this is similar to the previous example, but you can edit the current line in a
bash like manner (link(READLINE)(ADDRESS_READLINE)) and use the
link(history)(OPTION_HISTORY) file .http_history; socat() prints messages about
progress (link(-d -d)(option_d_d)). The  port is specified by service name
(www), and correct network line termination characters
(link(crnl)(OPTION_CRNL)) instead of NL are used.


COMMENT((bf(tt(socat TCP4-LISTEN:www TCP4:www.domain.org:www))))

label(EXAMPLE_ADDRESS_TCP4_LISTEN)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBTCP4-LISTEN:www \\ 
	TCP4:www.domain.org:www\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    TCP4-LISTEN:www &#x5C;
    TCP4:www.domain.org:www</div>)

installs a simple TCP port forwarder. With
link(TCP4-LISTEN)(ADDRESS_TCP4_LISTEN) it listens on local port "www" until a
connection comes in, accepts it, then connects to the remote host
(link(TCP4)(ADDRESS_TCP4_CONNECT)) and starts data transfer. It will not accept
a second connection. 

label(EXAMPLE_OPTION_BIND_TCP4)
label(EXAMPLE_OPTION_SO_REUSEADDR)
label(EXAMPLE_OPTION_FORK)
label(EXAMPLE_OPTION_SUBSTUSER)
label(EXAMPLE_OPTION_RANGE)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat -d -d -lmlocal2 \\)
mancommand(\.RS)
mancommand(\fBTCP4-LISTEN:80,bind=myaddr1,reuseaddr,fork,su=nobody,range=10.0.0.0/8 \\ 
	TCP4:www.domain.org:80,bind=myaddr2\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat -d -d -lmlocal2 &#x5C;
    TCP4-LISTEN:80,bind=myaddr1,su=nobody,fork,range=10.0.0.0/8,reuseaddr &#x5C;
    TCP4:www.domain.org:80,bind=myaddr2</div>)

TCP port forwarder, each side bound to another local IP address
(link(bind)(OPTION_BIND)). This example handles an almost
arbitrary number of parallel or consecutive connections by
link(fork)(OPTION_FORK)'ing a new 
process after each code(accept()). It provides a little security by
link(su)(OPTION_SUBSTUSER)'ing to user 
nobody after forking; it only permits connections from the private 10 network
(link(range)(OPTION_RANGE)); due to link(reuseaddr)(OPTION_SO_REUSEADDR), it
allows immediate restart after master process's termination, even if some child
sockets are not completely shut down.
With link(-lmlocal2)(option_lm), socat logs to stderr until successfully
reaching the accept loop. Further logging is directed to syslog with facility
local2.

label(EXAMPLE_ADDRESS_EXEC)
label(EXAMPLE_OPTION_TCPWRAPPERS)
label(EXAMPLE_OPTION_CHROOT)
label(EXAMPLE_OPTION_SUBSTUSER_DELAYED)
label(EXAMPLE_OPTION_PTY)
label(EXAMPLE_OPTION_STDERR)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBTCP4-LISTEN:5555,fork,tcpwrap=script \\ 
	EXEC:/bin/myscript,chroot=/home/sandbox,su-d=sandbox,pty,stderr\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    TCP4-LISTEN:5555,fork,tcpwrap=script &#x5C;
    EXEC:/bin/myscript,chroot=/home/sandbox,su-d=sandbox,pty,stderr</div>)

a simple server that accepts connections
(link(TCP4-LISTEN)(ADDRESS_TCP4_LISTEN)) and link(fork)(OPTION_FORK)'s a new
child process for each connection; every child acts as single relay. 
The client must match the rules for daemon process name "script" in
/etc/hosts.allow and /etc/hosts.deny, otherwise it is refused access (see "man
5 hosts_access").
For link(EXEC)(ADDRESS_EXEC)'uting the program, the child process
link(chroot)(OPTION_CHROOT)'s 
to file(/home/sandbox), link(su)(OPTION_SUBSTUSER)'s to user sandbox, and then starts 
the program file(/home/sandbox/bin/myscript). Socat() and
myscript communicate via a pseudo tty (link(pty)(OPTION_PTY)); myscript's
link(stderr)(OPTION_STDERR) is redirected to stdout,
so its error messages are transferred via socat() to the connected client. 

label(EXAMPLE_OPTION_FDIN)
label(EXAMPLE_OPTION_FDOUT)
label(EXAMPLE_OPTION_CRNL)
label(EXAMPLE_OPTION_MSS)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBEXEC:"mail.sh target@domain.com",fdin=3,fdout=4 \\ 
	TCP4:mail.relay.org:25,crnl,bind=alias1.server.org,mss=512\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    EXEC:"mail.sh target@domain.com",fdin=3,fdout=4 &#x5C;
    TCP4:mail.relay.org:25,crnl,bind=alias1.server.org,mss=512</div>)

file(mail.sh) is a shell script, distributed with socat(), that implements a
simple 
SMTP client. It is programmed to "speak" SMTP on its FDs 3 (in) and 4 (out).
The link(fdin)(OPTION_FDIN) and link(fdout)(OPTION_FDOUT) options tell socat()
to use these FDs for communication with 
the program. Because mail.sh inherits stdin and stdout while socat() does not
use them, the script can read a
mail body from stdin. Socat() makes alias1 your local source address
(link(bind)(OPTION_BIND)), cares for correct network line termination
(link(crnl)(OPTION_CRNL)) and sends  
at most 512 data bytes per packet (link(mss)(OPTION_MSS)). 


label(EXAMPLE_ADDRESS_GOPEN)
label(EXAMPLE_OPTION_TERMIOS_RAWER)
label(EXAMPLE_OPTION_ESCAPE)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fB-,escape=0x0f \\ 
	/dev/ttyS0,rawer,crnl\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    -,escape=0x0f &#x5C;
    /dev/ttyS0,rawer,crnl</div>)

opens an interactive connection via the serial line, e.g. for talking with a
modem. link(rawer)(OPTION_TERMIOS_RAWER) sets the console's and
ttyS0's terminal parameters to practicable values, link(crnl)(OPTION_CRNL) 
converts to correct newline characters. link(escape)(OPTION_ESCAPE) allows
terminating the socat process with character control-O. 
Consider using link(READLINE)(ADDRESS_READLINE) instead of the first address.


label(EXAMPLE_ADDRESS_UNIX_LISTEN)
label(EXAMPLE_ADDRESS_SOCKS4)
label(EXAMPLE_OPTION_SOCKSUSER)
label(EXAMPLE_OPTION_SOURCEPORT)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBUNIX-LISTEN:/tmp/.X11-unix/X1,fork \\ 
	SOCKS4:host.victim.org:127.0.0.1:6000,socksuser=nobody,sourceport=20\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    UNIX-LISTEN:/tmp/.X11-unix/X1,fork &#x5C;
    SOCKS4:host.victim.org:127.0.0.1:6000,socksuser=nobody,sourceport=20</div>)

with link(UNIX-LISTEN)(ADDRESS_UNIX_LISTEN), socat() opens a listening
unixdomain() socket file(/tmp/.X11-unix/X1). This path corresponds 
to local XWindow display :1 on your machine, so XWindow client connections to
DISPLAY=:1 are accepted. Socat() then speaks with
the link(SOCKS4)(ADDRESS_SOCKS4) server host.victim.org that might permit 
link(sourceport)(OPTION_SOURCEPORT) 20 based connections due to an FTP related
weakness in its static IP filters. Socat()
pretends to be invoked by link(socksuser)(OPTION_SOCKSUSER) nobody, and
requests to be connected to 
loopback port 6000 (only weak sockd configurations will allow this). So we get
a connection to the victims XWindow server and, if it does not require MIT
cookies or Kerberos authentication, we can start work. Please note that there
can only be one connection at a time, because TCP can establish only one
session with a given set of addresses and ports.


label(EXAMPLE_option_u)
label(EXAMPLE_OPTION_IGNOREEOF)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat -u \\)
mancommand(\.RS)
mancommand(\fB/tmp/readdata,seek-end=0,ignoreeof \\)
mancommand(\fBSTDIO\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat -u &#x5C;
    /tmp/readdata,seek-end=0,ignoreeof &#x5C;
    STDIO</div>)

this is an example for unidirectional data transfer
(link(-u)(option_u)). Socat() transfers data 
from file /tmp/readdata (implicit address link(GOPEN)(ADDRESS_GOPEN)), starting
at its current end (link(seek-end)(OPTION_SEEK_END)=0 lets socat() start 
reading at current end of file; use link(seek)(OPTION_SEEK)=0 or no
seek option to first read the existing data) in a "tail -f" like mode
(link(ignoreeof)(OPTION_IGNOREEOF)). The "file" 
might also be a listening unixdomain() socket (do not use a seek option then). 


label(EXAMPLE_OPTION_SETSID)
label(EXAMPLE_OPTION_CTTY)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fB(sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) | \\)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBEXEC:'ssh -l user server',pty,setsid,ctty\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">(sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) | 
socat - &#x5C;
    EXEC:'ssh -l user server',pty,setsid,ctty</div>)

link(EXEC)(ADDRESS_EXEC)'utes an ssh session to server. Uses a link(pty)(OPTION_PTY) for communication between socat() and
ssh, makes it ssh's controlling tty (link(ctty)(OPTION_CTTY)), 
and makes this pty the owner of
a new process group (link(setsid)(OPTION_SETSID)), so ssh accepts the password from socat().


label(EXAMPLE_ADDRESS_OPEN)
label(EXAMPLE_OPTION_CREAT)
label(EXAMPLE_OPTION_APPEND)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat -u \\)
mancommand(\.RS)
mancommand(\fBTCP4-LISTEN:3334,reuseaddr,fork \\ 
	OPEN:/tmp/in.log,creat,append\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat -u &#x5C;
    TCP4-LISTEN:3334,reuseaddr,fork &#x5C;
    OPEN:/tmp/in.log,creat,append</div>)

implements a simple network based message collector. 
For each client connecting to port 3334, a new child process is generated (option link(fork)(OPTION_FORK)).
All data sent by the clients are link(append)(OPTION_APPEND)'ed to the file /tmp/in.log.
If the file does not exist, socat link(creat)(OPTION_O_CREAT)'s it. 
Option link(reuseaddr)(OPTION_SO_REUSEADDR) allows immediate restart of the server
process. 

COMMENT(
dit(bf(tt(socat TCP4-LISTEN:3335,reuseaddr,fork OPEN:/tmp/motd,rdonly)))

implements a simple network based motd server.
For each client connecting to port 3335, a new child process is generated
(option link(fork)(OPTION_FORK)).
The contents of the file /tmp/motd is sent to each client.
Messages sent by clients result in an error due to option link(rdonly)(OPTION_RDONLY).
Option link(reuseaddr)(OPTION_SO_REUSEADDR) allows immediate restart of the server
process.  
)
COMMENT(
dit(bf(tt(socat - TCP4-LISTEN:8080,mtudiscover=0,rcvbuf=2048)))

changes some socket parameters to confuse active OS fingerprinting methods.
link(mtudiscover)(OPTION_MTUDISCOVER)=0 sets the DF (don'ft fragment flag) in
the IP packets to 0 and link(rcvbuf)(OPTION_RCVBUF) changes the initial TCP
window size.
)

label(EXAMPLE_OPTION_NOECHO)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBREADLINE,noecho='[Pp]assword:' \\ 
	EXEC:'ftp ftp.server.com',pty,setsid,ctty\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    READLINE,noecho='[Pp]assword:' &#x5C;
    EXEC:'ftp ftp.server.com',pty,setsid,ctty</div>)

wraps a command line history (link(READLINE)(ADDRESS_READLINE)) around the link(EXEC)(ADDRESS_EXEC)'uted ftp client utility.
This allows editing and reuse of FTP commands for relatively comfortable
browsing through the ftp directory hierarchy. The password is echoed!
 link(pty)(OPTION_PTY) is required to have ftp issue a prompt.
Nevertheless, there may occur some confusion with the password and FTP
prompts.


label(EXAMPLE_ADDRESS_PTY)
label(EXAMPLE_OPTION_SYMBOLIC_LINK)
label(EXAMPLE_OPTION_WAIT_SLAVE)
label(EXAMPLE_OPTION_NONBLOCK)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBPTY,link=$HOME/dev/vmodem0,rawer,wait-slave \\ 
	EXEC:'"ssh modemserver.us.org socat - /dev/ttyS0,nonblock,rawer"'\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    PTY,link=$HOME/dev/vmodem0,rawer,wait-slave &#x5C;
    EXEC:'"ssh modemserver.us.org socat - /dev/ttyS0,nonblock,rawer"'</div>)

generates a pseudo terminal 
device (link(PTY)(ADDRESS_PTY)) on the client that can be reached under the
symbolic link(link)(OPTION_SYMBOLIC_LINK) file($HOME/dev/vmodem0). 
An application that expects a serial line or modem
can be configured to use file($HOME/dev/vmodem0); its traffic will be directed
to a modemserver via ssh where another socat instance links it to
file(/dev/ttyS0).


label(EXAMPLE_OPTION_NETNS)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsudo socat --experimental \\)
mancommand(\.RS)
mancommand(\fBTCP4-LISTEN:8000,reuseaddr,fork,netns=namespace1 \\ 
	 TCP4-CONNECT:server2:8000\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">sudo socat --experimental &#x5C;
    TCP4-LISTEN:8000,reuseaddr,fork,netns=namespace1 &#x5C;
    TCP4-CONNECT:server2:8000</div>)

creates a listener in the given network namespace that accepts TCP connections
on port 8000 and forwards them to server2.


label(EXAMPLE_TUN_NETNS)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsudo socat --experimental \\)
mancommand(\.RS)
mancommand(\fBTUN:192.168.2.1/24,up \\ 
	 TUN:192.168.2.2/24,up,netns=namespace2\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">sudo socat --experimental &#x5C;
    TUN:192.168.2.1/24,up &#x5C;
    TUN:192.168.2.2/24,up,netns=namespace2</div>)

creates two virtual network interfaces, one in default namespace, the other one
in namespace2, and forwards packets between them, acting as a virtual
network connection.


label(EXAMPLE_PROXY_CONNECT)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBTCP4-LISTEN:2022,reuseaddr,fork \\ 
	PROXY:proxy.local:www.domain.org:22,proxyport=3128,proxyauth=username:s3cr3t\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    TCP4-LISTEN:2022,reuseaddr,fork &#x5C;
    PROXY:proxy.local:www.domain.org:22,proxyport=3128,proxyauth=username:s3cr3t</div>)

starts a forwarder that accepts connections on port 2022, and directs them 
through the link(proxy)(ADDRESS_PROXY_CONNECT) daemon listening on port 3128
(link(proxyport)(OPTION_PROXYPORT)) on host proxy.local, using the
CONNECT method, where they are authenticated as "username" with "s3cr3t"
(link(proxyauth)(OPTION_PROXY_AUTHORIZATION)). proxy.local
should establish connections to host www.domain.org on port 22 then.


label(EXAMPLE_ADDRESS_OPENSSL_CONNECT)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBSSL:server:4443,cafile=./server.crt,cert=./client.pem\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    SSL:server:4443,cafile=./server.crt,cert=./client.pem</div>)

is an OpenSSL client that tries to establish a secure connection to an SSL
server. Option link(cafile)(OPTION_OPENSSL_CAFILE) specifies a file that
contains trust certificates: we trust the server only when it presents one of
these certificates and proofs that it owns the related private key. 
Otherwise the connection is terminated.
With link(cert)(OPTION_OPENSSL_CERTIFICATE) a file containing the client certificate
and the associated private key is specified. This is required in case the
server wishes a client authentication; many Internet servers do not.nl()
The first address ('-') can be replaced by almost any other socat address.


label(EXAMPLE_ADDRESS_OPENSSL_LISTEN)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBOPENSSL-LISTEN:4443,reuseaddr,pf=ip4,fork,cert=./server.pem,cafile=./client.crt \\ 
	PIPE\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    OPENSSL-LISTEN:4443,reuseaddr,pf=ip4,fork,cert=./server.pem,cafile=./client.crt &#x5C;
    PIPE</div>)

is an OpenSSL server that accepts TCP connections, presents the certificate
from the file server.pem and forces the client to present a certificate that is
verified against cafile.crt.nl()
The second address ('PIPE') can be replaced by almost any other socat
address.nl()
For instructions on generating and distributing OpenSSL keys and certificates
see the additional socat docu tt(socat-openssl.txt).


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBecho |
socat -u - \\)
mancommand(\.RS)
mancommand(\fBFILE:/tmp/bigfile,create,largefile,seek=100000000000\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">echo | 
socat -u - &#x5C;
    FILE:/tmp/bigfile,create,largefile,seek=100000000000</div>)

creates a 100GB+1B sparse file; this requires a file system type that
supports this (ext2, ext3, ext4, reiserfs, xfs; not minix, vfat). The operation of
writing 1 byte might take long (reiserfs: some minutes; ext2: "no" time), and
the resulting file can consume some disk space with just its inodes (reiserfs:
2MB; ext2: 16KB). 


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBTCP-L:7777,reuseaddr,fork \\ 
	SYSTEM:'filan -i 0 -s >&2',nofork\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    TCP-L:7777,reuseaddr,fork &#x5C;
    SYSTEM:'filan -i 0 -s >&2',nofork</div>)

listens for incoming TCP connections on port 7777. For each accepted
connection, invokes a shell. This shell has its stdin and stdout directly
connected to the TCP socket (link(nofork)(OPTION_NOFORK)).  The shell starts filan and lets it print the socket addresses to
stderr (your terminal window).


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBecho -e "\\0\\14\\0\\0\\c" |
socat -u - \\)
mancommand(\.RS)
mancommand(\fBFILE:/usr/bin/squid.exe,seek=0x00074420\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">echo -e "\0\14\0\0\c" |
socat -u - &#x5C;
    FILE:/usr/bin/squid.exe,seek=0x00074420</div>)

functions as primitive binary editor: it writes the 4 bytes 000 014 000 000 to
the executable /usr/bin/squid.exe at offset 0x00074420 (this was a real world patch
to make the squid executable from Cygwin run under Windows, in 2004).


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBTCP:www.blackhat.org:31337,readbytes=1000\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    TCP:www.blackhat.org:31337,readbytes=1000</div>)

connects to an unknown service and prevents being flooded.


label(EXAMPLE_END_CLOSE)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat -U \\)
mancommand(\.RS)
mancommand(\fBTCP:target:9999,end-close \\ 
	TCP-L:8888,reuseaddr,fork\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat -U &#x5C;
    TCP:target:9999,end-close &#x5C;
    TCP-L:8888,reuseaddr,fork</div>)

merges data arriving from different TCP streams on port 8888 to just one stream
to target:9999. The link(end-close)(OPTION_END_CLOSE) option prevents the child
processes forked off by the second address from terminating the shared
connection to 9999 (NOEXPAND(close(2)) just unlinks the inode which stays active as long
as the parent process lives; NOEXPAND(shutdown(2)) would actively terminate the
connection).


label(EXAMPLE_GENERIC_DCCP_SERVER)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBTCP-LISTEN:10021,reuseaddr,socktype=6,protocol=33,fork \\
	PIPE\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    TCP-LISTEN:10021,reuseaddr,socktype=6,protocol=33,fork &#x5C;
    PIPE</div>)

is a simple DCCP echo server. It uses socat()s TCP procedures, but changes the
socket type to SOCK_DCCP=6 (on Linux) and the IP protocol to IPPROTO_DCCP=33.
This works in contrast to attempts with UDP basis, even though DCCP is named a
datagram protocol.


label(EXAMPLE_GENERIC_DCCP_CLIENT)

mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBTCP:<server>:10021,reuseaddr,socktype=6,protocol=33,fork\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    TCP:<server>:10021,reuseaddr,socktype=6,protocol=33,fork</div>)

is a simple DCCP client. It uses socat()s TCP procedures, but changes the
socket type to SOCK_DCCP=6 (on Linux) and the IP protocol to IPPROTO_DCCP=33.


label(EXAMPLE_ADDRESS_UDP4_BROADCAST_CLIENT)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBUDP4-DATAGRAM:192.168.1.0:123,sp=123,broadcast,range=192.168.1.0/24\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    UDP4-DATAGRAM:192.168.1.0:123,sp=123,broadcast,range=192.168.1.0/24</div>)

sends a broadcast to the network 192.168.1.0/24 and receives the replies of the
timeservers there. Ignores NTP packets from hosts outside this network.


label(EXAMPLE_ADDRESS_GENERIC_CLIENT)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBSOCKET-DATAGRAM:2:2:17:x007bxc0a80100x0000000000000000,bind=x007bx00000000x0000000000000000,setsockopt-int=1:6:1,range=x0000xc0a80100x0000000000000000:x0000xffffff00x0000000000000000\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    SOCKET-DATAGRAM:2:2:17:x007bxc0a80100x0000000000000000,bind=x007bx00000000x0000000000000000,setsockopt-int=1:6:1,range=x0000xc0a80100x0000000000000000:x0000xffffff00x0000000000000000</div>)

is semantically equivalent to the link(previous
example)(EXAMPLE_ADDRESS_UDP4_BROADCAST_CLIENT), but all parameters are
specified in generic form. the value 6 of setsockopt-int is the Linux value for
tt(SO_BROADCAST).


label(EXAMPLE_ADDRESS_IP4_BROADCAST_CLIENT)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBIP4-DATAGRAM:255.255.255.255:44,broadcast,range=10.0.0.0/8\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    IP4-DATAGRAM:255.255.255.255:44,broadcast,range=10.0.0.0/8</div>)

sends a broadcast to the local NOEXPAND(network(s)) using protocol 44. Accepts replies
from the private address range only.


label(EXAMPLE_ADDRESS_UDP4_MULTICAST)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBUDP4-DATAGRAM:224.255.0.1:6666,bind=:6666,ip-add-membership=224.255.0.1:eth0\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    UDP4-DATAGRAM:224.255.0.1:6666,bind=:6666,ip-add-membership=224.255.0.1:eth0</div>)

transfers data from stdin to the specified multicast address using UDP. Both
local and remote ports are 6666. Tells the interface eth0 to also accept
multicast packets of the given group. Multiple hosts on the local network can
run this command, so all data sent by any of the hosts will be received
by all the other ones. Note that there are many possible reasons for failure,
including IP-filters, routing issues, wrong interface selection by the
operating system, bridges, or a badly configured switch.


label(EXAMPLE_ADDRESS_TUN)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBUDP:host2:4443 \\ 
	TUN:192.168.255.1/24,up\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    UDP:host2:4443 &#x5C;
    TUN:192.168.255.1/24,up</div>)

establishes one side of a virtual (but not private!) network with host2 where a
similar process might run, with UDP-L and tun address 192.168.255.2. They can
reach each other using the addresses 192.168.255.1 and 192.168.255.2. Note that
streaming eg.via TCP or SSL does not guarantee to retain packet boundaries and
might thus cause packet loss.


label(EXAMPLE_ADDRESS_VSOCK)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBVSOCK-CONNECT:2:1234\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    VSOCK-CONNECT:2:1234</div>)

establishes a VSOCK connection with the host (host is always reachable with
the well-know CID=2) on 1234 port.


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBVSOCK-LISTEN:1234\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    VSOCK-LISTEN:1234</div>)

listens for a VSOCK connection on 1234 port.


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat - \\)
mancommand(\.RS)
mancommand(\fBVSOCK-CONNECT:31:4321,bind:5555\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat - &#x5C;
    VSOCK-CONNECT:31:4321,bind:5555</div>)

establishes a VSOCK connection with the guest that have CID=31 on 1234 port,
binding the local socket to the 5555 port.


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBVSOCK-LISTEN:3333,reuseaddr,fork \\ 
	VSOCK-CONNECT:42,3333\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    VSOCK-LISTEN:3333,reuseaddr,fork &#x5C;
    VSOCK-CONNECT:42,3333</div>)

starts a forwarder that accepts VSOCK connections on port 3333, and directs
them to the guest with CID=42 on the same port.


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBVSOCK-LISTEN:22,reuseaddr,fork \\ 
	TCP:localhost:22\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    VSOCK-LISTEN:22,reuseaddr,fork &#x5C;
    TCP:localhost:22</div>)

forwards VSOCK connections from 22 port to the local SSH server.
Running this in a VM allows you to connect via SSH from the host using VSOCK,
as in the example below.


mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBTCP4-LISTEN:22222,reuseaddr,fork \\ 
	VSOCK-CONNECT:33:22\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    TCP4-LISTEN:22222,reuseaddr,fork &#x5C;
	   VSOCK-CONNECT:33:22</div>)

forwards TCP connections from 22222 port to the guest with CID=33 listening on
VSOCK port 22.
Running this in the host, allows you to connect via SSH running
"ssh -p 22222 user@localhost", if the guest runs the example above.


label(EXAMPLE_INTERFACE)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat \\)
mancommand(\.RS)
mancommand(\fBPTY,link=/var/run/ppp,rawer \\ 
	INTERFACE:hdlc0\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat &#x5C;
    PTY,link=/var/run/ppp,rawer &#x5C;
    INTERFACE:hdlc0</div>)

circumvents the problem that pppd requires a serial device and thus might not
be able to work on a synchronous line that is represented by a network device.
socat creates a PTY to make pppd happy, binds to the network
link(interface)(ADDRESS_INTERFACE) tt(hdlc0), and can transfer data between
both devices. Use pppd on device tt(/var/run/ppp) then.


label(EXAMPLE_POSIXMQ_SEND)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat --experimental -u \\)
mancommand(\.RS)
mancommand(\fBSTDIO \\ 
	POSIXMQ-SEND:/queue1,unlink-early,mq-prio=10\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat --experimental -u &#x5C;
    STDIO &#x5C;
    POSIXMQ-SEND:/queue1,unlink-early,mq-prio=10</div>)

Writes packets read from stdio (i.e., lines of input when run interactively)
into POSIX message queue, with priority 10.


label(EXAMPLE_POSIXMQ_RECV_FORK)

mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat --experimental -u \\)
mancommand(\.RS)
mancommand(\fBPOSIXMQ-RECV:/queue1,fork,max-children=3 \\ 
	SYSTEM:"robot.sh"\fP)

mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat --experimental -u &#x5C;
    POSIXMQ-RECV:/queue1,fork,max-children=3 &#x5C;
    SYSTEM:"robot.sh"</div>)

Receives messages (packets) from POSIX message queue and, for each messages,
forks a sub process that reads and processes the message. At most 3 sub
processes are allowed at the same time.


label(EXAMPLE_HTTPECHO)
COMMENT( dit(bf(tt(socat -T 1 -d -d TCP-L:10081,reuseaddr,fork,crlf SYSTEM:"echo -e \"\\\"HTTP/1.0 200 OK\\\nDocumentType: text/plain\\\n\\\ndate: \$\(date\)\\\nserver:\$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT\\\nclient: \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\\\n\\\"\"; cat; echo -e \"\\\"\\\n\\\"\""))) )
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat -T 1 -d -d \\)
mancommand(\.RS)
mancommand(\fBTCP-L:10081,reuseaddr,fork,crlf \\ 
	SYSTEM:"echo -e \\"\\\\\\"HTTP/1.0 200 OK\\\\\\nDocumentType: text/plain\\\\\\n\\\\\\ndate: \\$\\(date\\)\\\\\\nserver:\\$SOCAT_SOCKADDR:\\$SOCAT_SOCKPORT\\\\\\nclient: \\$SOCAT_PEERADDR:\\$SOCAT_PEERPORT\\\\\\n\\\\\\"\\"; cat; echo -e \\"\\\\\\"\\\\\\n\\\\\\"\\""\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat -T 1 -d -d &#x5C;
    TCP-L:10081,reuseaddr,fork,crlf &#x5C;
    SYSTEM:"echo -e \"\\\"HTTP/1.0 200 OK\\\nDocumentType: text/plain\\\n\\\ndate: \$\(date\)\\\nserver:\$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT\\\nclient: \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\\\n\\\"\"; cat; echo -e \"\\\"\\\n\\\"\""</div>)

creates a very primitive HTTP echo server: each HTTP client that connects gets
a valid
HTTP reply that contains information about the client address and port as it is
seen by the server host, the host address (which might vary on multihomed
servers), and the original client request.


label(EXAMPLE_ANCILLARY)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsocat -d -d \\)
mancommand(\.RS)
mancommand(\fBUDP4-RECVFROM:9999,so-broadcast,so-timestamp,ip-pktinfo,ip-recverr,ip-recvopts,ip-recvtos,ip-recvttl!!- \\ 
	SYSTEM:'export; sleep 1' |\fP)
mancommand(\.RE)
mancommand(\fBgrep SOCAT\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">socat -d -d &#x5C;
    UDP4-RECVFROM:9999,so-broadcast,so-timestamp,ip-pktinfo,ip-recverr,ip-recvopts,ip-recvtos,ip-recvttl!!- &#x5C;
    SYSTEM:'export; sleep 1' |
grep SOCAT</div>)

waits for an incoming UDP packet on port 9999 and prints the environment 
variables provided by socat. On BSD based systems you have to replace
link(tt(ip-pktinfo))(OPTION_IP_PKTINFO) with link(tt(ip-recvdstaddr))(OPTION_IP_RECVDSTADDR),link(tt(ip-recvif))(OPTION_IP_RECVIF). Especially of interest is
SOCAT_IP_DSTADDR: it contains the target address of the packet which may be a
unicast, multicast, or broadcast address.


label(EXAMPLE_SSDP)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBecho -e "M-SEARCH * HTTP/1.1\\nHOST: 239.255.255.250:1900\\nMAN: \\"ssdp:discover\\"\\nMX: 4\\nST: \\"ssdp:all\\"\\n" |
socat - \\)
mancommand(\.RS)
mancommand(\fBUDP-DATAGRAM:239.255.255.250:1900,crlf\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">echo -e "M-SEARCH * HTTP/1.1\nHOST: 239.255.255.250:1900\nMAN: \"ssdp:discover\"\nMX: 4\nST: \"ssdp:all\"\n" | &#x5C;
socat - &#x5C;
    UDP-DATAGRAM:239.255.255.250:1900,crlf</div>)

sends an SSDP (Simple Service Discovery Protocol) query to the local network
and collects and outputs the answers received.


label(EXAMPLE_ADDRESS_ACCEPT_FD)
mancommand(\.LP)
mancommand(\.nf)
mancommand(\fBsystemd-socket-activate -l 1077 --inetd socat ACCEPT:0,fork PIPE\fP)
mancommand(\.RE)
mancommand(\.fi)

htmlcommand(<hr><div class="shell">systemd-socket-activate -l 1077 --inetd socat ACCEPT:0,fork PIPE</div>)

tt(systemd-socket-activate) is a program for testing tt(systemd) socket
activation of daemons. With tt(--inetd) it waits for a connection on the
specified port. It does not accept the connection but passes the listening file
descriptor as FDs 0 and 1. Socat() accepts the waiting connection and starts
data transfer.


dit(bf(tt()))



enddit()


label(DIAGNOSTICS)
manpagediagnostics()

Socat() uses a logging mechanism that allows filtering messages by severity. The
severities provided are more or less compatible to the appropriate syslog
priority. With one or up to four occurrences of the -d command line option, the
lowest priority of messages that are issued can be selected. Each message
contains a single uppercase character specifying the messages severity (one of
F, E, W, N, I, or D)

description(
dit(FATAL:) Conditions that require unconditional and immediate program termination.
dit(ERROR:) Conditions that prevent proper program processing. Usually the
program is terminated (see link(option -s)(option_s)).
dit(WARNING:) Something did not function correctly or is in a state where
correct further processing cannot be guaranteed, but might be possible.
dit(NOTICE:) Interesting actions of the program, e.g. for supervising socat() in some kind of server mode.
dit(INFO:) Description of what the program does, and maybe why it
happens. Allows monitoring the lifecycles of file descriptors.
dit(DEBUG:) Description of how the program works, all system or library calls and their results.
)

Log messages can be written to stderr, to a file, or to syslog.

On exit, socat() gives status 0 if it terminated due to EOF or inactivity
timeout, with a positive value on error, and with a negative value on fatal
error. 


label(FILES)
manpagefiles()

/usr/bin/socat nl()
/usr/bin/filan nl()
/usr/bin/procan


label(SIGNALS)
manpagesection(SIGNALS)

description(
label(signal_usr1)dit(SIGUSR1:) Causes logging of current transfer statistics.
nl()
See also link(option --statistics)(option_statistics)
)


label(ENVIRONMENT_VARIABLES)
manpagesection(ENVIRONMENT VARIABLES)

Input variables carry information from the environment to socat, output
variables are set by socat for use in executed scripts and programs.

In the output variables beginning with "SOCAT" this prefix is actually replaced
by the upper case name of the executable or the value of option
link(-lp)(option_lp).

startdit()
label(ENV_SOCAT_DEFAULT_LISTEN_IP)
dit(bf(SOCAT_DEFAULT_LISTEN_IP) (input)) (Values 4 or 6) Sets the IP version to
be used for listen, recv, and recvfrom addresses if no
link(pf)(OPTION_PROTOCOL_FAMILY) (protocol-family) option is given. Is
overridden by socat options link(-4)(option_4) or link(-6)(option_6).

dit(bf(SOCAT_PREFERRED_RESOLVE_IP) (input)) (Values 0, 4, or 6) Sets the IP
version to 
be used when resolving target host names when version is not specified by
address type, option link(pf)(OPTION_PROTOCOL_FAMILY) (protocol-family), or
address format. If name resolution does not return a matching entry, the first
result (with differing IP version) is taken. With value 0, socat always selects
the first record and its IP version. 

dit(bf(SOCAT_MAIN_WAIT) (input)) Specifies the time (seconds) to sleep the
main process on begin of main\(). Useful for debugging.

dit(bf(SOCAT_TRANSFER_WAIT) (input)) Specifies the time (seconds) to sleep the
process after opening addresses before entering the transfer loop. Useful for
debugging.

dit(bf(SOCAT_FORK_WAIT) (input)) Specifies the time (seconds) to sleep the
parent and child processes after successful NOEXPAND(fork()). Useful for
debugging.

dit(bf(SOCAT_VERSION) (output)) Socat sets this variable to its version string,
e.g. tt("1.7.0.0") for released versions or e.g. tt("1.6.0.1+envvar") for
temporary versions; can be used in scripts invoked by socat. 

dit(bf(SOCAT_PID) (output)) Socat sets this variable to its process id. In case
of link(fork)(OPTION_FORK) address option, SOCAT_PID gets the child processes
id. Forking for link(exec)(ADDRESS_EXEC), link(system)(ADDRESS_SYSTEM), and
link(SHELL)(ADDRESS_SHELL) does not change SOCAT_PID.

dit(bf(SOCAT_PPID) (output)) Socat sets this variable to its process id. In
case of link(fork)(OPTION_FORK), SOCAT_PPID keeps the pid of the master process.

dit(bf(SOCAT_PEERADDR) (output)) With passive socket addresses (all LISTEN and
RECVFROM addresses), this variable is set to a string describing the peers
socket address. Port information is not included.

dit(bf(SOCAT_PEERPORT) (output)) With appropriate passive socket addresses
(TCP, UDP, and SCTP - LISTEN and RECVFROM), this variable is set to a string containing the
number of the peer port.

dit(bf(SOCAT_SOCKADDR) (output)) With all LISTEN addresses, this variable is
set to a string describing the local socket address. Port information is not
included link(example)(EXAMPLE_HTTPECHO)

dit(bf(SOCAT_SOCKPORT) (output)) With link(TCP-LISTEN)(ADDRESS_TCP_LISTEN),
link(UDP-LISTEN)(ADDRESS_UDP_LISTEN), and
link(SCTP-LISTEN)(ADDRESS_SCTP_LISTEN) addresses, this variable is set to the
local port.

dit(bf(SOCAT_TIMESTAMP) (output)) With all RECVFROM addresses where address
option link(so-timestamp)(OPTION_SO_TIMESTAMP) is applied, socat sets this
variable to the resulting timestamp.

dit(bf(SOCAT_IP_OPTIONS) (output)) With all IPv4 based RECVFROM addresses where 
address option link(ip-recvopts)(OPTION_IP_RECVOPTS) is applied, socat fills
this variable with the IP options of the received packet.

dit(bf(SOCAT_IP_DSTADDR) (output)) With all IPv4 based RECVFROM addresses where
address option link(ip-recvdstaddr)(OPTION_IP_RECVDSTADDR) (BSD) or
link(ip-pktinfo)(OPTION_IP_PKTINFO) (other platforms) is applied, socat sets
this variable to the destination address of the received packet. This is
particularly useful to identify broadcast and multicast addressed packets.

dit(bf(SOCAT_IP_IF) (output)) With all IPv4 based RECVFROM addresses where
address option link(ip-recvif)(OPTION_IP_RECVIF) (BSD) or
link(ip-pktinfo)(OPTION_IP_PKTINFO) (other platforms) is applied, socat sets 
this variable to the name of the interface where the packet was received.

dit(bf(SOCAT_IP_LOCADDR) (output)) With all IPv4 based RECVFROM
addresses where address option link(ip-pktinfo)(OPTION_IP_PKTINFO) is applied,
socat sets this variable to the address of the interface where the packet was
received.

dit(bf(SOCAT_IP_TOS) (output)) With all IPv4 based RECVFROM addresses where
address option link(ip-recvtos)(OPTION_IP_RECVTOS) is applied, socat sets this
variable to the TOS (type of service) of the received packet.

dit(bf(SOCAT_IP_TTL) (output)) With all IPv4 based RECVFROM addresses where
address option link(ip-recvttl)(OPTION_IP_RECVTTL) is applied, socat sets this
variable to the TTL (time to live) of the received packet.

dit(bf(SOCAT_IPV6_HOPLIMIT) (output)) With all IPv6 based RECVFROM addresses
where address option link(ipv6-recvhoplimit)(OPTION_IPV6_RECVHOPLIMIT) is
applied, socat sets this variable to the hoplimit value of the received packet.

dit(bf(SOCAT_IPV6_DSTADDR) (output)) With all IPv6 based RECVFROM
addresses where address option link(ipv6-recvpktinfo)(OPTION_IPV6_RECVPKTINFO)
is applied, socat sets this variable to the destination address of the received
packet.

dit(bf(SOCAT_IPV6_TCLASS) (output)) With all IPv6 based RECVFROM addresses
where address option link(ipv6-recvtclass)(OPTION_IPV6_RECVTCLASS) is applied,
socat() sets this variable to the transfer class of the received packet.

dit(bf(SOCAT_OPENSSL_X509_ISSUER) (output)) Issuer field from peer certificate

dit(bf(SOCAT_OPENSSL_X509_SUBJECT) (output)) Subject field from peer certificate

dit(bf(SOCAT_OPENSSL_X509_COMMONNAME) (output)) commonName entries from peer certificates subject. Multiple values are separated by " // ".

dit(bf(SOCAT_OPENSSL_X509_*) (output)) all other entries from peer certificates subject

dit(bf(SOCAT_OPENSSL_X509V3_DNS) (output)) DNS entries from peer certificates extensions - subjectAltName field. Multiple values are separated by " // ".

dit(bf(HOSTNAME) (input)) Is used to determine the hostname for logging (see
link(-lh)(option_lh)).

dit(bf(LOGNAME) (input)) Is used as name for the socks client user name if no
link(socksuser)(OPTION_SOCKSUSER) is given.nl()
With options link(su)(OPTION_SUBSTUSER) and
link(su-d)(OPTION_SUBSTUSER_DELAYED), LOGNAME is set to the given user name.

dit(bf(USER) (input)) Is used as name for the socks client user name if no
link(socksuser)(OPTION_SOCKSUSER) is given and LOGNAME is empty.nl()
With options link(su)(OPTION_SUBSTUSER) and
link(su-d)(OPTION_SUBSTUSER_DELAYED), USER is set to the given user name.

dit(bf(SHELL) (output))
With options link(su)(OPTION_SUBSTUSER) and
link(su-d)(OPTION_SUBSTUSER_DELAYED), SHELL is set to the login shell of the
given user.

dit(bf(PATH) (output))
Can be set with option link(path)(OPTION_PATH) for link(exec)(ADDRESS_EXEC),
link(system)(ADDRESS_SYSTEM), and link(SHELL)(ADDRESS_SHELL) addresses.

dit(bf(HOME) (output))
With options link(su)(OPTION_SUBSTUSER) and
link(su-d)(OPTION_SUBSTUSER_DELAYED), HOME is set to the home directory of the
given user.

enddit()

label(CREDITS)
manpagesection(CREDITS)

The work of the following groups and organizations was invaluable for this
project:

The em(FSF) (GNU, lurl(http://www.fsf.org/)) project 
with their free and portable development software and
lots of other useful tools and libraries.

The em(Linux developers community) (lurl(http://www.linux.org/)) for providing a free, open source operating
system.

The em(Open Group) (lurl(http://www.unix-systems.org/)) for making their
standard specifications available on the Internet for free.


label(VERSION)
manpagesection(VERSION)

This man page describes version 1.7.4 of socat().


label(BUGS)
manpagebugs()

Addresses cannot be nested, so a single socat process cannot, e.g., drive ssl
over socks.

Address option ftruncate without value uses default 1 instead of 0.

Verbose modes (-x and/or -v) display line termination characters inconsistently
when address options cr or crnl are used: They show the data em(after)
conversion in either direction.

The data transfer blocksize setting (-b) is ignored with address readline.
 
Send bug reports to <socat@dest-unreach.org>


label(SEEALSO)
manpageseealso()

COMMENT(NOEXPAND(procan(1)), NOEXPAND(filan(1)), )
NOEXPAND(nc(1)), NOEXPAND(rinetd(8)), NOEXPAND(openssl(1)),
NOEXPAND(stunnel(8)), NOEXPAND(rlwrap(1)), NOEXPAND(setsid(1))

Socat() home page lurl(http://www.dest-unreach.org/socat/)

label(AUTHOR)
manpageauthor()

Gerhard Rieger <rieger@dest-unreach.org> and contributors
