orca/src/platform/platform_socket.h

162 lines
5.0 KiB
C

/************************************************************//**
*
* @file: platform_socket.h
* @author: Martin Fouilleul
* @date: 22/03/2019
* @revision:
*
*****************************************************************/
#ifndef __PLATFORM_SOCKET_H_
#define __PLATFORM_SOCKET_H_
#include<sys/time.h> // timeval
#include"typedefs.h"
#ifdef __cplusplus
extern "C" {
#else
typedef struct timeval timeval;
#endif //__cplusplus
//----------------------------------------------------------------------------------
// Errors
//----------------------------------------------------------------------------------
//TODO(martin): extend these error codes
const int SOCK_ERR_OK = 0,
SOCK_ERR_UNKNOWN = -1,
SOCK_ERR_ACCESS = -2,
SOCK_ERR_MEM = -3,
SOCK_ERR_INTR = -4,
SOCK_ERR_USED = -5,
SOCK_ERR_BADF = -6,
SOCK_ERR_ABORT = -7,
SOCK_ERR_NBLOCK = -8;
int SocketGetLastError();
const char* SocketGetLastErrorMessage();
//----------------------------------------------------------------------------------
// Addresses
//----------------------------------------------------------------------------------
//NOTE(martin): net_ip and net_port are stored in network byte order
// host_ip and host_port are stored in host byte order
typedef uint32 net_ip;
typedef uint16 net_port;
typedef uint32 host_ip;
typedef uint16 host_port;
typedef struct
{
net_ip ip;
net_port port;
} socket_address;
//NOTE(martin): these are in host byte order !
const host_ip SOCK_IP_LOOPBACK = 0x7f000001;
const host_ip SOCK_IP_ANY = 0;
const host_port SOCK_PORT_ANY = 0;
net_ip StringToNetIP(const char* addr);
const char* NetIPToString(net_ip ip);
host_ip StringToHostIP(const char* addr);
const char* HostIPToString(host_ip ip);
net_ip HostToNetIP(host_ip ip);
net_port HostToNetPort(host_port port);
host_ip NetToHostIP(net_ip ip);
host_port NetToHostPort(net_port port);
int SocketGetIFAddresses(int* count, net_ip* ips);
net_ip SocketGetDefaultExternalIP();
//----------------------------------------------------------------------------------
// Socket API
//----------------------------------------------------------------------------------
typedef struct platform_socket platform_socket;
typedef enum { SOCK_UDP, SOCK_TCP } socket_transport;
const int SOCK_MSG_OOB = 0x01,
SOCK_MSG_PEEK = 0x02,
SOCK_MSG_DONTROUTE = 0x04,
SOCK_MSG_WAITALL = 0x40;
platform_socket* SocketOpen(socket_transport transport);
int SocketClose(platform_socket* socket);
int SocketBind(platform_socket* socket, socket_address* addr);
int SocketListen(platform_socket* socket, int backlog);
platform_socket* SocketAccept(platform_socket* socket, socket_address* from);
int SocketConnect(platform_socket* socket, socket_address* addr);
int64 SocketReceive(platform_socket* socket, void* buffer, uint64 size, int flags);
int64 SocketReceiveFrom(platform_socket* socket, void* buffer, uint64 size, int flags, socket_address* from);
int64 SocketSend(platform_socket* socket, void* buffer, uint64 size, int flags);
int64 SocketSendTo(platform_socket* socket, void* buffer, uint64 size, int flags, socket_address* to);
int SocketGetAddress(platform_socket* socket, socket_address* addr);
//----------------------------------------------------------------------------------
// Multiplexing
//----------------------------------------------------------------------------------
const uint8 SOCK_ACTIVITY_IN = 1<<0,
SOCK_ACTIVITY_OUT = 1<<2,
SOCK_ACTIVITY_ERR = 1<<3;
typedef struct
{
platform_socket* sock;
uint8 watch;
uint8 set;
} socket_activity;
int SocketSelect(uint32 count, socket_activity* set, double timeout);
//----------------------------------------------------------------------------------
// Socket Options
//----------------------------------------------------------------------------------
int SocketSetReceiveTimeout(platform_socket* socket, timeval* tv);
int SocketSetSendTimeout(platform_socket* socket, timeval* tv);
int SocketSetBroadcast(platform_socket* sock, bool enable);
int SocketSetReuseAddress(platform_socket* sock, bool enable);
int SocketSetReusePort(platform_socket* sock, bool enable);
int SocketSetReceiveTimestamping(platform_socket* socket, bool enable);
//----------------------------------------------------------------------------------
// Multicast
//----------------------------------------------------------------------------------
int SocketSetMulticastLoop(platform_socket* sock, bool enable);
int SocketJoinMulticastGroup(platform_socket* socket, host_ip group, host_ip interface);
int SocketLeaveMulticastGroup(platform_socket* socket, host_ip group, host_ip interface);
//----------------------------------------------------------------------------------
//Ancillary data API
//----------------------------------------------------------------------------------
typedef struct
{
u64 messageBufferSize;
char* messageBuffer;
u64 controlBufferSize;
char* controlBuffer;
} socket_msg;
int SocketReceiveMessage(platform_socket* socket, socket_msg* msg, socket_address* from);
#ifdef __cplusplus
} // extern "C"
#endif
#endif //__PLATFORM_SOCKET_H_