int socketlistener_start()

in src/socket_listener_win32.c [48:113]


int socketlistener_start(SOCKET_LISTENER_HANDLE socket_listener, ON_SOCKET_ACCEPTED on_socket_accepted, void* callback_context)
{
    int result;

    if ((socket_listener == NULL) ||
        (on_socket_accepted == NULL))
    {
        LogError("Bad arguments: socket_listener = %p, on_socket_accepted = %p",
            socket_listener, on_socket_accepted);
        result = MU_FAILURE;
    }
    else
    {
        socket_listener->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (socket_listener->socket == INVALID_SOCKET)
        {
            LogError("Could not create socket");
            result = MU_FAILURE;
        }
        else
        {
            u_long iMode = 1;
            struct sockaddr_in service;

            socket_listener->on_socket_accepted = on_socket_accepted;
            socket_listener->callback_context = callback_context;

            // The sockaddr_in structure specifies the address family,
            // IP address, and port for the socket that is being bound.
            service.sin_family = AF_INET;
            service.sin_addr.s_addr = INADDR_ANY;
            service.sin_port = htons((u_short)socket_listener->port);

            if (bind(socket_listener->socket, (SOCKADDR *)&service, sizeof(service)) == SOCKET_ERROR)
            {
                LogError("Could not bind socket");
                (void)closesocket(socket_listener->socket);
                socket_listener->socket = INVALID_SOCKET;
                result = MU_FAILURE;
            }
            else if (ioctlsocket(socket_listener->socket, FIONBIO, &iMode) != 0)
            {
                LogError("Could not set listening socket in non-blocking mode");
                (void)closesocket(socket_listener->socket);
                socket_listener->socket = INVALID_SOCKET;
                result = MU_FAILURE;
            }
            else
            {
                if (listen(socket_listener->socket, SOMAXCONN) == SOCKET_ERROR)
                {
                    LogError("Could not start listening for connections");
                    (void)closesocket(socket_listener->socket);
                    socket_listener->socket = INVALID_SOCKET;
                    result = MU_FAILURE;
                }
                else
                {
                    result = 0;
                }
            }
        }
    }

    return result;
}