You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.5 KiB
192 lines
6.5 KiB
//========= 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
|