16.8.2 Closing a Socket

When you have finished using a socket, you can simply close its file descriptor with close; see Opening and Closing Files. If there is still data waiting to be transmitted over the connection, normally close tries to complete this transmission. You can control this behavior using the SO_LINGER socket option to specify a timeout period; see Socket Options.

You can also shut down only reception or transmission on a connection by calling shutdown, which is declared in sys/socket.h.

Function: int shutdown (int socket, int how)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

The shutdown function shuts down the connection of socket socket. The argument how specifies what action to perform:

SHUT_RD

Stop receiving data on the socket.

SHUT_WR

Indicate to the peer that no further data will be transmitted on the socket. This indication is ordered with regard to past send operations on the socket, and data pending at the time of the call is still delivered.

SHUT_RDWR

Combine the actions of SHUT_RD and SHUT_WR.

The return value is 0 on success and -1 on failure. The following generic errno error conditions are defined for this function:

EBADF

socket is not a valid file descriptor.

ENOTSOCK

socket is not a socket.

ENOTCONN

socket is not connected.

Additional errors can be reported for specific socket types.

The exact impact of the shutdown function depends on the socket protocol and its implementation. In portable code, the shutdown function cannot be used on its own to gracefully terminate a connection which is operated in full-duplex mode (with both peers sending data).

On Linux, when SHUT_RD is used to shut down a TCP socket, any pending data in the incoming socket buffer and any data that arrives subsequently is discarded, without reporting an error or generating a TCP RST segment. Attempts to read data from this socket using recv and similar functions (see Receiving Data) return zero. (Other systems may treat SHUT_RD with pending data as a data loss event and generate RST segments. Linux AF_LOCAL/AF_UNIX sockets also report errors to peers.)

Similarly, when SHUT_WR is used on a Linux TCP socket, a FIN segment is sent to the peer, ordered after any data written previously to the socket. After encountering the FIN segment, the peer will recognize this as an end-of-stream condition.