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