Close the socket.
This function is used to close the socket. Any asynchronous send, receive
or connect operations will be cancelled immediately, and will complete
Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.
For portable behaviour with respect to graceful closure of a connected
shutdown() before closing the socket.