diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/net.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'engine/net.h')
| -rw-r--r-- | engine/net.h | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/engine/net.h b/engine/net.h new file mode 100644 index 0000000..3c8762a --- /dev/null +++ b/engine/net.h @@ -0,0 +1,192 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// net.h -- Half-Life's interface to the networking layer +// For banning IP addresses (or allowing private games) +#ifndef NET_H +#define NET_H +#ifdef _WIN32 +#pragma once +#endif + +#include "common.h" +#include "bitbuf.h" +#include "netadr.h" +#include "proto_version.h" + +// Flow control bytes per second limits +#define MAX_RATE (1024*1024) +#define MIN_RATE 1000 +#define DEFAULT_RATE 80000 + +#define SIGNON_TIME_OUT 300.0f // signon disconnect timeout + +#define FRAGMENT_BITS 8 +#define FRAGMENT_SIZE (1<<FRAGMENT_BITS) +#define MAX_FILE_SIZE_BITS 26 +#define MAX_FILE_SIZE ((1<<MAX_FILE_SIZE_BITS)-1) // maximum transferable size is 64MB + +// 0 == regular, 1 == file stream +#define MAX_STREAMS 2 + +#define FRAG_NORMAL_STREAM 0 +#define FRAG_FILE_STREAM 1 + +#define TCP_CONNECT_TIMEOUT 4.0f +#define PORT_ANY -1 +#define PORT_TRY_MAX 32 +#define TCP_MAX_ACCEPTS 8 + +#define LOOPBACK_SOCKETS 2 + +#define STREAM_CMD_NONE 0 // waiting for next blob +#define STREAM_CMD_AUTH 1 // first command, send back challengenr +#define STREAM_CMD_DATA 2 // receiving a data blob +#define STREAM_CMD_FILE 3 // receiving a file blob +#define STREAM_CMD_ACKN 4 // acknowledged a recveived blob + +// NETWORKING INFO + +// This is the packet payload without any header bytes (which are attached for actual sending) +#define NET_MAX_PAYLOAD 288000 // largest message we can send in bytes +#define NET_MAX_PAYLOAD_V23 96000 // largest message we can send in bytes +#define NET_MAX_PAYLOAD_BITS_V23 17 // 2^NET_MAX_PAYLOAD_BITS > NET_MAX_PAYLOAD +// This is just the client_t->netchan.datagram buffer size (shouldn't ever need to be huge) +#define NET_MAX_DATAGRAM_PAYLOAD 4000 // = maximum unreliable payload size + +// UDP has 28 byte headers +#define UDP_HEADER_SIZE (20+8) // IP = 20, UDP = 8 + + +#define MAX_ROUTABLE_PAYLOAD 1260 // Matches x360 size + +#if (MAX_ROUTABLE_PAYLOAD & 3) != 0 +#error Bit buffers must be a multiple of 4 bytes +#endif + +#define MIN_ROUTABLE_PAYLOAD 16 // minimum playload size + +#define NETMSG_TYPE_BITS 6 // must be 2^NETMSG_TYPE_BITS > SVC_LASTMSG + +#define NETMSG_LENGTH_BITS 11 // 256 bytes + +// This is the payload plus any header info (excluding UDP header) + +#define HEADER_BYTES 9 // 2*4 bytes seqnr, 1 byte flags + +// Pad this to next higher 16 byte boundary +// This is the largest packet that can come in/out over the wire, before processing the header +// bytes will be stripped by the networking channel layer +#define NET_MAX_MESSAGE PAD_NUMBER( ( NET_MAX_PAYLOAD + HEADER_BYTES ), 16 ) + +// Even connectionless packets require int32 value (-1) + 1 byte content +#define NET_MIN_MESSAGE 5 + +#define NET_HEADER_FLAG_SPLITPACKET -2 +#define NET_HEADER_FLAG_COMPRESSEDPACKET -3 + +class INetChannel; + +enum +{ + NS_CLIENT = 0, // client socket + NS_SERVER, // server socket + NS_HLTV, + NS_MATCHMAKING, + NS_SYSTEMLINK, +#ifdef LINUX + NS_SVLAN, // LAN udp port for Linux. See NET_OpenSockets for info. +#endif + MAX_SOCKETS +}; + +typedef struct netpacket_s +{ + netadr_t from; // sender IP + int source; // received source + double received; // received time + unsigned char *data; // pointer to raw packet data + bf_read message; // easy bitbuf data access + int size; // size in bytes + int wiresize; // size in bytes before decompression + bool stream; // was send as stream + struct netpacket_s *pNext; // for internal use, should be NULL in public +} netpacket_t; + +extern netadr_t net_local_adr; +extern double net_time; + +class INetChannelHandler; +class IConnectionlessPacketHandler; + +// Start up networking +void NET_Init( bool bDedicated ); +// Shut down networking +void NET_Shutdown (void); +// Read any incoming packets, dispatch to known netchannels and call handler for connectionless packets +void NET_ProcessSocket( int sock, IConnectionlessPacketHandler * handler ); +// Set a port to listen mode +void NET_ListenSocket( int sock, bool listen ); +// Send connectionsless string over the wire +void NET_OutOfBandPrintf(int sock, const netadr_t &adr, PRINTF_FORMAT_STRING const char *format, ...) FMTFUNCTION( 3, 4 ); +// Send a raw packet, connectionless must be provided (chan can be NULL) +int NET_SendPacket ( INetChannel *chan, int sock, const netadr_t &to, const unsigned char *data, int length, bf_write *pVoicePayload = NULL, bool bUseCompression = false ); +// Called periodically to maybe send any queued packets (up to 4 per frame) +void NET_SendQueuedPackets(); +// Start set current network configuration +void NET_SetMutiplayer(bool multiplayer); +// Set net_time +void NET_SetTime( double realtime ); +// RunFrame must be called each system frame before reading/sending on any socket +void NET_RunFrame( double realtime ); +// Check configuration state +bool NET_IsMultiplayer( void ); +bool NET_IsDedicated( void ); +// Writes a error file with bad packet content +void NET_LogBadPacket(netpacket_t * packet); + +// bForceNew (used for bots) tells it not to share INetChannels (bots will crash when disconnecting if they +// share an INetChannel). +INetChannel *NET_CreateNetChannel(int socketnumber, netadr_t *adr, const char * name, INetChannelHandler * handler, bool bForceNew=false, + int nProtocolVersion=PROTOCOL_VERSION ); +void NET_RemoveNetChannel(INetChannel *netchan, bool bDeleteNetChan); +void NET_PrintChannelStatus( INetChannel * chan ); + +void NET_WriteStringCmd( const char * cmd, bf_write *buf ); + +// Address conversion +bool NET_StringToAdr ( const char *s, netadr_t *a); +// Convert from host to network byte ordering +unsigned short NET_HostToNetShort( unsigned short us_in ); +// and vice versa +unsigned short NET_NetToHostShort( unsigned short us_in ); + +// Find out what port is mapped to a local socket +unsigned short NET_GetUDPPort(int socket); + +// add/remove extra sockets for testing +int NET_AddExtraSocket( int port ); +void NET_RemoveAllExtraSockets(); + +const char *NET_ErrorString (int code); // translate a socket error into a friendly string + +//============================================================================ + +// Message data +typedef struct +{ + // Size of message sent/received + int size; + // Time that message was sent/received + float time; +} flowstats_t; + +// Some hackery to avoid using va() in constructor since we cache off the pointer to the string in the ConVar!!! +#define NET_STRINGIZE( x ) #x +#define NET_MAKESTRING( macro, val ) macro(val) +#define NETSTRING( val ) NET_MAKESTRING( NET_STRINGIZE, val ) +#endif // !NET_H |