getsockopt

This function retrieves a socket option.

At a Glance

Header file: Winsock.h
Windows CE versions: 1.0 and later

Syntax

int getsockopt (SOCKET s, int level, int optname, char *optval, int *optlen);

Parameters

s

[in] Descriptor that identifies a socket.

level

[in] Level at which the option is defined; the supported levels include SOL_SOCKET, IPPROTO_TCP, and IPPROTO_IP.

In Windows CE, the following level values are available when the level is IPPROTO_IP:

Value Description
IP_MULTICAST_TTL Time to Live for a multicast packet. Retrieves the number of hops for which a multicast message survives before it is discarded. Use int for optval.
IP_MULTICAST_IF Address of the outgoing multicast-capable interface. This address is used for subsequent multicasts. Use unsigned long for optval.
IP_MULTICAST_LOOP Status of the socket’s loop behavior during multicast. Use unsigned long for optval.

optname

[in] Socket option for which the value is to be retrieved.

optval

[out] Pointer to the buffer in which the value for the requested option is to be returned.

optlen

[in/out] Pointer to the optval buffer size.

Return Values

Zero indicates no error occurred. SOCKET_ERROR indicates failure. To get a specific error value, call WSAGetLastError.

Windows CE Remarks

For IrSockets implementation:

IrSockets supports several special socket options:

Value Type Meaning
IRLMP_ENUMDEVICES * DEVICELIST Describes devices in range.
IRLMP_IAS_QUERY * IAS_QUERY Retrieve IAS attributes.
IRLMP_SEND_PDU_LEN * int Retrieves the maximum number of bytes that can be sent in any one send() call while in IRLMP_IRLPT_MODE (printing). This value should be retrieved after the connect() completes, but before data is sent.

The DEVICELIST structure is an extendible array of device descriptions. IrSockets fills in as many device descriptions as can fit in the supplied buffer and returns in the optlen result parameter the required size if the buffer is of insufficient size. The device description consists of a device identifier necessary to form a sockaddr_irda structure and a displayable string describing the device.

The IAS_QUERY structure is used to retrieve a single attribute of a single class. The application specifies the device and class to query and the attribute and attribute type. It is expected that the application allocates a buffer of the necessary size for the returned parameters.

Many SO level socket options are meaningless to IrSockets. Only SO_LINGER and SO_DONTLINGER are specifically supported.

Remarks

The getsockopt function retrieves the current value for a socket option associated with a socket of any type, in any state, and stores the result in optval. Options can exist at multiple protocol levels, but they are always present at the uppermost socket level. Options affect socket operations, such as the packet routing and out-of-band data transfer.

The value associated with the selected option is returned in the buffer optval. The integer pointed to by optlen should originally contain the size of this buffer; on return, it will be set to the size of the value returned. For SO_LINGER, this will be the size of a LINGER structure. For most other options, it will be the size of an integer.

The application is responsible for allocating memory space pointed to directly, or indirectly by any parameters it specified.

If the option was never set with setsockopt, then getsockopt returns the default value for the option.

The following options are supported for getsockopt. The Type column identifies the type of data addressed by optval.

level = SOL_SOCKET

Value Type Description
SO_ACCEPTCONN BOOL Socket is listening.
SO_BROADCAST BOOL Socket is configured for the transmission of broadcast messages.
SO_DEBUG BOOL Debugging is enabled.
SO_DONTLINGER BOOL If TRUE, the SO_LINGER option is disabled.
SO_DONTROUTE BOOL Routing is disabled.
SO_ERROR int Retrieves error status and clear.
SO_GROUP_ID GROUP The group identifier to which this socket belongs.
SO_GROUP_PRIORITY int The relative priority for sockets that are part of a socket group.
SO_KEEPALIVE BOOL Keepalives are being sent.
SO_LINGER struct LINGER Returns the current linger options.
SO_MAX_MSG_SIZE unsigned int Maximum size of a message for message-oriented socket types (for example, SOCK_DGRAM). Has no meaning for stream oriented sockets.
SO_OOBINLINE BOOL Out-of-band data is being received in the normal data stream.
SO_RCVBUF int Buffer size for receives.
SO_REUSEADDR BOOL The socket can be bound to an address which is already in use.
SO_SNDBUF int Buffer size for sends.
SO_TYPE int The socket type (for example, SOCK_STREAM).
PVD_CONFIG Service Provider Dependent An opaque data structure object from the service provider associated with socket s. This object stores the current service provider configuration data. The exact format of this data structure is service provider specific.

level = IPPROTO_TCP

Value Type Description
TCP_NODELAY BOOL Disables the Nagle algorithm for send coalescing.

BSD options not supported for getsockopt are as follows.

Value Type Meaning
SO_RCVLOWAT int Receive low water mark.
SO_RCVTIMEO int Receive time-out.
SO_SNDLOWAT int Send low water mark.
SO_SNDTIMEO int Send time-out.
TCP_MAXSEG int Get TCP maximum segment size.

Calling getsockopt with an unsupported option will result in an error value of WSAENOPROTOOPT being returned by WSAGetLastError.

SO_DEBUG

Windows Sockets service providers are encouraged, but not required, to supply output debug data if the SO_DEBUG option is set by an application. The mechanism for generating the debug data and the form it takes are beyond the scope of this document.

SO_ERROR

The SO_ERROR option returns and resets the per socket based error value, which is different from the per thread based error value that is handled using the WSAGetLastError and WSASetLastError function calls. A successful call using the socket does not reset the socket based error value returned by the SO_ERROR option.

SO_GROUP_ID

This option is reserved for future use with socket groups. This option is also exclusive to getsockopt. It indicates the group identifier to which this socket belongs. Socket group identifiers are unique across all processes for a given service provider. If this socket is not a group socket, the value is NULL.

SO_GROUP_PRIORITY

This option is reserved for future use with socket groups. Group priority indicates the priority of the specified socket relative to other sockets within the socket group. Values are non-negative integers, with zero corresponding to the highest priority. Priority values represent a hint to the underlying service provider about how potentially scarce resources should be allocated. For example, when two or more sockets are ready to transmit data, the highest priority socket (lowest value for SO_GROUP_PRIORITY) should be serviced first, with the remainder serviced in turn according to their relative priorities.

The WSAENOPROTOOPT error value is indicated for non group sockets or for service providers that do not support group sockets.

SO_KEEPALIVE

An application can request that a TCP/IP service provider enable the use of keep-alive packets on TCP connections by turning on the SO_KEEPALIVE socket option. A Windows Sockets provider need not support the use of keep-alive: if it does, the precise semantics are implementation-specific but should conform to section 4.2.3.6 of RFC 1122: Requirements for Internet Host—Communication Layers. If a connection is dropped as the result of keep-alives, the error value WSAENETRESET is returned to calls in progress on the socket, and subsequent calls will fail with WSAENOTCONN.

SO_LINGER

SO_LINGER controls the action taken when unsent data is queued on a socket and a closesocket is performed. See closesocket for a description of the way in which the SO_LINGER settings affect the semantics of closesocket. The application gets the current behavior by retrieving a LINGER structure (pointed to by the optval parameter).

SO_MAX_MSG_SIZE

This is a get-only socket option that indicates the maximum outbound (send) size of a message for message-oriented socket types (for example, SOCK_DGRAM) as implemented by a particular service provider. It has no meaning for byte stream oriented sockets. There is no provision to find out the maximum inbound message size.

SO_SNDBUF

When a Windows Sockets implementation supports the SO_RCVBUF and SO_SNDBUF options, an application can request different buffer sizes (larger or smaller). The call to setsockopt can succeed even if the implementation did not provide the whole amount requested. An application must call this function with the same option to check the buffer size actually provided.

SO_REUSEADDR

By default, a socket cannot be bound (see bind) to a local address already in use. On occasion, however, it can be necessary to re-use an address in this way. Because every connection is uniquely identified by the combination of local and remote addresses, there is no problem with having two sockets bound to the same local address as long as the remote addresses are different. To inform the Windows Sockets provider that a bind on a socket should not be rejected because the desired address is already in use by another socket, the application should set the SO_REUSEADDR socket option for the socket before issuing the bind. The option is interpreted only at the time of the bind. It is therefore unnecessary, but harmless, to set the option on a socket that is not to be bound to an existing address, and setting or resetting the option after the bind has no effect on this or any other socket.

PVD_CONFIG

This option retrieves an opaque data structure object from the service provider associated with socket s. This object stores the current service provider configuration data. The exact data structure format is service provider-specific.

TCP_NODELAY

The TCP_NODELAY option is specific to TCP/IP service providers. The Nagle algorithm is disabled if the TCP_NODELAY option is enabled, and vice versa. The Nagle algorithm, as described in RFC 896, is very effective in reducing the number of small packets sent by a host. The process involves buffering send data when there is unacknowledged data already in route or buffering send data until a full-size packet can be sent. It is highly recommended that Windows Sockets implementations enable the Nagle Algorithm by default because, for the majority of application protocols, the Nagle Algorithm can deliver significant performance enhancements. However, for some applications this algorithm can impede performance, and setsockopt with the same option can be used to turn it off. These are applications where many small messages are sent, and the time delays between the messages are maintained.

See Also

setsockopt, socket, WSAStartup