2
0
mirror of https://github.com/rehlds/rehlds.git synced 2025-04-16 22:32:30 +03:00
rehlds/rehlds/engine/net_ws.h
2018-01-18 14:13:38 +03:00

218 lines
7.4 KiB
C

/*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#pragma once
#include "maintypes.h"
#include "enums.h"
#include "common.h"
#include "netadr.h"
#ifndef _WIN32
#define WSAEWOULDBLOCK EWOULDBLOCK // Operation would block EAGAIN (11)
#define WSAEMSGSIZE EMSGSIZE // Message too long (90)
#define WSAEADDRNOTAVAIL EADDRNOTAVAIL // Cannot assign requested address (99)
#define WSAEAFNOSUPPORT EAFNOSUPPORT // Address family not supported by protocol (97)
#define WSAECONNRESET ECONNRESET // Connection reset by peer (104)
#define WSAECONNREFUSED ECONNREFUSED // Connection refused (111)
#define WSAEADDRINUSE EADDRINUSE // Address already in use (98)
#define WSAENOBUFS ENOBUFS // No buffer space available (105)
#endif // _WIN32
const int MAX_ROUTEABLE_PACKET = 1400;
#define SPLIT_SIZE (MAX_ROUTEABLE_PACKET - sizeof(SPLITPACKET))
// Create general message queues
const int NUM_MSG_QUEUES = 40;
const int MSG_QUEUE_SIZE = 1536;
const int NET_HEADER_FLAG_SPLITPACKET = -2;
typedef struct loopmsg_s
{
unsigned char data[NET_MAX_MESSAGE];
int datalen;
} loopmsg_t;
const int MAX_LOOPBACK = 4;
typedef struct loopback_s
{
loopmsg_t msgs[MAX_LOOPBACK];
int get;
int send;
} loopback_t;
typedef struct packetlag_s
{
unsigned char *pPacketData; // Raw stream data is stored.
int nSize;
netadr_t net_from_;
float receivedTime;
struct packetlag_s *pNext;
struct packetlag_s *pPrev;
} packetlag_t;
typedef struct net_messages_s
{
struct net_messages_s *next;
qboolean preallocated;
unsigned char *buffer;
netadr_t from;
int buffersize;
} net_messages_t;
// Split long packets. Anything over 1460 is failing on some routers.
typedef struct LONGPACKET_t
{
int currentSequence;
int splitCount;
int totalSize;
// TODO: It should be NET_MAX_MESSAGE, but value differs
char buffer[MAX_UDP_PACKET]; // This has to be big enough to hold the largest message
} LONGPACKET;
// Use this to pick apart the network stream, must be packed
#pragma pack(push, 1)
typedef struct SPLITPACKET_t
{
int netID;
int sequenceNumber;
unsigned char packetID;
} SPLITPACKET;
#pragma pack(pop)
const int NET_WS_MAX_FRAGMENTS = 5;
extern qboolean net_thread_initialized;
extern cvar_t net_address;
extern cvar_t ipname;
extern cvar_t defport;
extern cvar_t ip_clientport;
extern cvar_t clientport;
extern int net_sleepforever;
extern loopback_t loopbacks[2];
extern packetlag_t g_pLagData[3];
extern float gFakeLag;
extern int net_configured;
#ifdef _WIN32
extern netadr_t net_local_ipx_adr;
#endif // _WIN32
extern netadr_t net_local_adr;
extern netadr_t net_from;
extern qboolean noip;
#ifdef _WIN32
extern qboolean noipx;
#endif // _WIN32
extern sizebuf_t net_message;
extern cvar_t clockwindow;
extern qboolean use_thread;
extern cvar_t iphostport;
extern cvar_t hostport;
#ifdef _WIN32
extern cvar_t ipx_hostport;
extern cvar_t ipx_clientport;
#endif // _WIN32
extern cvar_t multicastport;
extern cvar_t fakelag;
extern cvar_t fakeloss;
extern cvar_t net_graph;
extern cvar_t net_graphwidth;
extern cvar_t net_scale;
extern cvar_t net_graphpos;
extern unsigned char net_message_buffer[NET_MAX_PAYLOAD];
extern unsigned char in_message_buf[NET_MAX_PAYLOAD];
extern sizebuf_t in_message;
extern netadr_t in_from;
extern SOCKET ip_sockets[3];
#ifdef _WIN32
extern SOCKET ipx_sockets[3];
#endif // _WIN32
extern LONGPACKET gNetSplit;
extern net_messages_t *messages[3];
extern net_messages_t *normalqueue;
void NET_ThreadLock();
void NET_ThreadUnlock();
unsigned short Q_ntohs(unsigned short netshort);
void NetadrToSockadr(const netadr_t *a, struct sockaddr *s);
void SockadrToNetadr(const struct sockaddr *s, netadr_t *a);
NOXREF unsigned short NET_HostToNetShort(unsigned short us_in);
qboolean NET_CompareAdr(netadr_t& a, netadr_t& b);
qboolean NET_CompareClassBAdr(netadr_t& a, netadr_t& b);
qboolean NET_IsReservedAdr(netadr_t& a);
qboolean NET_CompareBaseAdr(const netadr_t& a, const netadr_t& b);
char *NET_AdrToString(const netadr_t& a);
char *NET_BaseAdrToString(netadr_t& a);
qboolean NET_StringToSockaddr(const char *s, struct sockaddr *sadr);
qboolean NET_StringToAdr(const char *s, netadr_t *a);
qboolean NET_IsLocalAddress(netadr_t& adr);
char *NET_ErrorString(int code);
void NET_TransferRawData(sizebuf_t *msg, unsigned char *pStart, int nSize);
qboolean NET_GetLoopPacket(netsrc_t sock, netadr_t *in_from_, sizebuf_t *msg);
void NET_SendLoopPacket(netsrc_t sock, int length, void *data, const netadr_t& to);
void NET_RemoveFromPacketList(packetlag_t *pPacket);
NOXREF int NET_CountLaggedList(packetlag_t *pList);
void NET_ClearLaggedList(packetlag_t *pList);
void NET_AddToLagged(netsrc_t sock, packetlag_t *pList, packetlag_t *pPacket, netadr_t *net_from_, sizebuf_t messagedata, float timestamp);
void NET_AdjustLag();
qboolean NET_LagPacket(qboolean newdata, netsrc_t sock, netadr_t *from, sizebuf_t *data);
void NET_FlushSocket(netsrc_t sock);
qboolean NET_GetLong(unsigned char *pData, int size, int *outSize);
qboolean NET_QueuePacket(netsrc_t sock);
int NET_Sleep();
void NET_StartThread();
void NET_StopThread();
void *net_malloc(size_t size);
net_messages_t *NET_AllocMsg(int size);
void NET_FreeMsg(net_messages_t *pmsg);
qboolean NET_GetPacket(netsrc_t sock);
void NET_AllocateQueues();
void NET_FlushQueues();
int NET_SendLong(netsrc_t sock, SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen);
void NET_SendPacket_api(unsigned int length, void *data, const netadr_t &to);
void NET_SendPacket(netsrc_t sock, int length, void *data, const netadr_t& to);
SOCKET NET_IPSocket(char *net_interface, int port, qboolean multicast);
void NET_OpenIP();
SOCKET NET_IPXSocket(int hostshort);
void NET_OpenIPX();
void NET_GetLocalAddress();
int NET_IsConfigured();
bool NET_CheckPort(int port);
void NET_Config(qboolean multiplayer);
void MaxPlayers_f();
void NET_Init();
void NET_ClearLagData(qboolean bClient, qboolean bServer);
void NET_Shutdown();
NOXREF qboolean NET_JoinGroup(netsrc_t sock, netadr_t& addr);
NOXREF qboolean NET_LeaveGroup(netsrc_t sock, netadr_t& addr);