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;
}