SOCKET RIOSOCKAPI CreateRIOSocket()

in cpp/Riosock/Riosock.cpp [411:480]


SOCKET RIOSOCKAPI CreateRIOSocket(
    _Out_    SOCKADDR  *localAddr,
    _Inout_  int       *localAddrLen
    )
{
    // DWORD dwFlags = WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED | WSA_FLAG_REGISTERED_IO;
    auto socket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, nullptr, 0, WSA_FLAG_REGISTERED_IO);
    if (INVALID_SOCKET == socket)
    {
        DWORD errorCode = WSAGetLastError();
        SetLastError(errorCode);
        return INVALID_SOCKET;
    }

    // Enables SIO_LOOPBACK_FAST_PATH
    auto OptionValue = 1;
    DWORD NumberOfBytesReturned = 0;
    if (WSAIoctl(socket,
                 SIO_LOOPBACK_FAST_PATH,
                 &OptionValue,
                 sizeof(OptionValue),
                 nullptr, 0,
                 &NumberOfBytesReturned,
                 nullptr, nullptr) == SOCKET_ERROR)
    {
        DWORD errorCode = WSAGetLastError();
        closesocket(socket);
        SetLastError(errorCode);
        return INVALID_SOCKET;
    }

    // Bind socket for exclusive access
    const BOOL bindExclUse = 1;
    if (setsockopt(socket,
        SOL_SOCKET,
        SO_EXCLUSIVEADDRUSE,
        reinterpret_cast<const char *>(&bindExclUse),
        sizeof(bindExclUse)) == SOCKET_ERROR)
    {
        // Unexpected failure: report it then close our socket
        DWORD errorCode = WSAGetLastError();
        closesocket(socket);
        SetLastError(errorCode);
        return INVALID_SOCKET;
    }

    // Bind the socket to the loop-back address
    SOCKADDR_IN sockAddr;
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    sockAddr.sin_port = htons(0);
    if (bind(socket, reinterpret_cast<SOCKADDR *>(&sockAddr), sizeof(sockAddr)) == SOCKET_ERROR)
    {
        DWORD errorCode = WSAGetLastError();
        closesocket(socket);
        SetLastError(errorCode);
        return INVALID_SOCKET;
    }

    // Retrieve the local name (addr) of the socket
    if (getsockname(socket, localAddr, localAddrLen) == SOCKET_ERROR)
    {
        DWORD errorCode = WSAGetLastError();
        closesocket(socket);
        SetLastError(errorCode);
        return INVALID_SOCKET;
    }

    return socket;
}