MSDN Documentation

Winsock: Closing Sockets

This section details how to properly close network sockets using the Windows Sockets API (Winsock). Properly closing sockets is crucial for releasing system resources and preventing network leaks.

The closesocket Function

The primary function for closing a socket in Winsock is closesocket. It deallocates the socket descriptor and associated resources.


int closesocket(
  SOCKET s
);
            

Parameters

Return Value

If the socket is successfully closed, closesocket returns 0. Otherwise, it returns a socket error code, which can be retrieved with WSAGetLastError.

Usage Example

Here's a simple example demonstrating how to close a socket after it's no longer needed:


#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")

int main() {
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        std::cerr << "WSAStartup failed: " << iResult << std::endl;
        return 1;
    }

    SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "socket creation failed: " << WSAGetLastError() << std::endl;
        WSACleanup();
        return 1;
    }

    std::cout << "Socket created successfully." << std::endl;

    // ... (Perform socket operations here: connect, send, receive) ...

    std::cout << "Closing socket..." << std::endl;
    iResult = closesocket(clientSocket);
    if (iResult == SOCKET_ERROR) {
        std::cerr << "closesocket failed: " << WSAGetLastError() << std::endl;
        WSACleanup();
        return 1;
    }

    std::cout << "Socket closed successfully." << std::endl;

    WSACleanup();
    return 0;
}
            

Important Considerations

Note: After calling closesocket, the socket descriptor becomes invalid and cannot be used for any further socket operations. Attempting to use a closed socket will result in an error.

Important: Ensure that all data has been sent and received before closing a socket, especially for connection-oriented protocols like TCP. For TCP sockets, a graceful shutdown sequence (using shutdown before closesocket) might be necessary to inform the peer that no more data will be sent.

Graceful Shutdown with shutdown

For TCP sockets, you can use the shutdown function to control the direction of data transmission before closing the socket. This allows for a more controlled termination of the connection.


int shutdown(
  SOCKET s,
  int how
);
            

The how parameter can be one of the following:

After calling shutdown, you should still call closesocket to release the socket resources.

For example, to gracefully close both sending and receiving operations:


shutdown(clientSocket, SD_BOTH);
closesocket(clientSocket);