mirror of
https://github.com/rehlds/rehlds.git
synced 2025-04-16 22:32:30 +03:00
218 lines
7.4 KiB
C
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);
|