1
0
mirror of https://github.com/solemnwarning/directplay-lite synced 2024-12-30 16:45:37 +01:00
directplay-lite/src/network.cpp
2018-09-20 00:58:41 +01:00

156 lines
2.8 KiB
C++

#include <winsock2.h>
#include <windows.h>
#include <stdint.h>
#include "network.hpp"
int create_udp_socket(uint32_t ipaddr, uint16_t port)
{
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock == -1)
{
return -1;
}
u_long non_blocking = 1;
if(ioctlsocket(sock, FIONBIO, &non_blocking) != 0)
{
closesocket(sock);
return -1;
}
BOOL broadcast = TRUE;
if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)(&broadcast), sizeof(BOOL)) == -1)
{
closesocket(sock);
return -1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ipaddr;
addr.sin_port = htons(port);
if(bind(sock, (struct sockaddr*)(&addr), sizeof(addr)) == -1)
{
closesocket(sock);
return -1;
}
return sock;
}
int create_listener_socket(uint32_t ipaddr, uint16_t port)
{
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1)
{
return -1;
}
u_long non_blocking = 1;
if(ioctlsocket(sock, FIONBIO, &non_blocking) != 0)
{
closesocket(sock);
return -1;
}
BOOL reuse = TRUE;
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)(&reuse), sizeof(BOOL)) == -1)
{
closesocket(sock);
return -1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ipaddr;
addr.sin_port = htons(port);
if(bind(sock, (struct sockaddr*)(&addr), sizeof(addr)) == -1)
{
closesocket(sock);
return -1;
}
if(listen(sock, LISTEN_QUEUE_SIZE) == -1)
{
closesocket(sock);
return -1;
}
return sock;
}
int create_client_socket(uint32_t local_ipaddr, uint16_t local_port)
{
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1)
{
return -1;
}
u_long non_blocking = 1;
if(ioctlsocket(sock, FIONBIO, &non_blocking) != 0)
{
closesocket(sock);
return -1;
}
BOOL reuse = TRUE;
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)(&reuse), sizeof(BOOL)) == -1)
{
closesocket(sock);
return -1;
}
struct sockaddr_in l_addr;
l_addr.sin_family = AF_INET;
l_addr.sin_addr.s_addr = local_ipaddr;
l_addr.sin_port = htons(local_port);
if(bind(sock, (struct sockaddr*)(&l_addr), sizeof(l_addr)) == -1)
{
closesocket(sock);
return -1;
}
return sock;
}
int create_discovery_socket()
{
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock == -1)
{
return -1;
}
u_long non_blocking = 1;
if(ioctlsocket(sock, FIONBIO, &non_blocking) != 0)
{
closesocket(sock);
return -1;
}
BOOL reuse = TRUE;
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)(&reuse), sizeof(BOOL)) == -1)
{
closesocket(sock);
return -1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(DISCOVERY_PORT);
if(bind(sock, (struct sockaddr*)(&addr), sizeof(addr)) == -1)
{
closesocket(sock);
return -1;
}
return sock;
}