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
|
|
|