summaryrefslogtreecommitdiff
path: root/tracker/common/Socket.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /tracker/common/Socket.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'tracker/common/Socket.h')
-rw-r--r--tracker/common/Socket.h162
1 files changed, 162 insertions, 0 deletions
diff --git a/tracker/common/Socket.h b/tracker/common/Socket.h
new file mode 100644
index 0000000..8ff4569
--- /dev/null
+++ b/tracker/common/Socket.h
@@ -0,0 +1,162 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+#if !defined( SOCKET_H )
+#define SOCKET_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "netadr.h"
+#include "MsgBuffer.h"
+#include "utlvector.h"
+
+#include <stdio.h>
+
+class CMsgBuffer;
+class CSocket;
+class IGameList;
+
+// Use this to pick apart the network stream, must be packed
+#pragma pack(1)
+typedef struct
+{
+ int netID;
+ int sequenceNumber;
+ char packetID;
+} SPLITPACKET;
+#pragma pack()
+
+#define MAX_PACKETS 16 // 4 bits for the packet count, so only
+#define MAX_RETRIES 2 // the number of fragments from other packets to drop before we declare the outstanding
+ // fragment lost :)
+
+//-----------------------------------------------------------------------------
+// Purpose: Instances a message handler for incoming messages.
+//-----------------------------------------------------------------------------
+class CMsgHandler
+{
+public:
+ enum
+ {
+ MAX_HANDLER_STRING = 64
+ };
+
+ typedef enum
+ {
+ MSGHANDLER_ALL = 0,
+ MSGHANDLER_BYTECODE,
+ MSGHANDLER_STRING
+ } HANDLERTYPE;
+
+ // Construction
+ CMsgHandler( HANDLERTYPE type, void *typeinfo = 0 );
+ virtual ~CMsgHandler( void );
+
+ // Message received, process it
+ virtual bool Process( netadr_t *from, CMsgBuffer *msg ) = 0;
+
+ // For linking togethr handler chains
+ virtual CMsgHandler *GetNext( void ) const;
+ virtual void SetNext( CMsgHandler *next );
+
+ // Access/set associated socket
+ virtual CSocket *GetSocket( void ) const;
+ virtual void SetSocket( CSocket *socket );
+
+private:
+ // Internal message received, crack type info and check it before calling process
+ bool ProcessMessage( netadr_t *from, CMsgBuffer *msg );
+
+ // Opaque pointer to underlying recipient class
+ IGameList *m_pBaseObject;
+
+ // Next handler in chain
+ HANDLERTYPE m_Type;
+ unsigned char m_ByteCode;
+ char m_szString[ MAX_HANDLER_STRING ];
+
+ // Next handler in chain
+ CMsgHandler *m_pNext;
+ // Associated socket
+ CSocket *m_pSocket;
+
+ friend CSocket;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: Creates a non-blocking, broadcast capable, UDP socket. If port is
+// specified, binds it to listen on that port, otherwise, chooses a random port.
+//-----------------------------------------------------------------------------
+class CSocket
+{
+public:
+ // Construction/destruction
+ CSocket( const char *socketname, int port = -1 );
+ virtual ~CSocket( void );
+
+ // Adds the message hander to the head of the sockets handler chain
+ virtual void AddMessageHandler( CMsgHandler *handler );
+ // Removes the specified message handler
+ virtual void RemoveMessageHandler( CMsgHandler *handler );
+
+ // Send the message to the recipient, if msg == NULL, use the internal message buffer
+ virtual int SendMessage( netadr_t *to, CMsgBuffer *msg = NULL );
+ // Broadcast the message on the specified port, if msg == NULL use the internal message buffer
+ virtual int Broadcast( int port, CMsgBuffer *msg = NULL );
+ // Get access to the internal message buffer
+ virtual CMsgBuffer *GetSendBuffer( void );
+ // Called once per frame to check for new data
+ virtual void Frame( void );
+ // Check whether the socket was created and set up properly
+ virtual bool IsValid( void ) const;
+ // Get the address this socket is bound to
+ virtual const netadr_t *GetAddress( void );
+
+ // Allow creating object to store a 32 bit value and retrieve it
+ virtual void SetUserData( unsigned int userData );
+ virtual unsigned int GetUserData(void ) const;
+
+ // Allow other objects to get the raw socket interger
+ virtual int GetSocketNumber( void ) const;
+ // Called when FD_ISSET noted that the socket has incoming data
+ virtual bool ReceiveData( void );
+ // Called to get current time
+ static float GetClock( void );
+
+private:
+ const char *m_pSocketName;
+ // Socket listen address
+ bool m_bValid;
+ // Socket IP address
+ netadr_t m_Address;
+ // Has the IP address been resolved
+ bool m_bResolved;
+ // Internal message buffers
+ CUtlVector<CMsgBuffer> m_MsgBuffers;
+ CMsgBuffer m_SendBuffer;
+ // critical section for accessing buffers
+ void *m_pBufferCS;
+ // One or more listeners for the incoming message
+ CMsgHandler *m_pMessageHandlers;
+ // Winsock socket number
+ int m_Socket;
+ // User 32 bit value
+ unsigned int m_nUserData;
+ // Socket to which non Broadcast SendMessage was directed. The socket will wait for a response
+ // from that exact address
+ netadr_t m_ToAddress;
+ // Set to true if the send was a Broadcast, and therefore from != to address is okay
+ bool m_bBroadcastSend;
+
+ int m_iTotalPackets; // total number of packets in a fragment
+ int m_iCurrentPackets; // current packet count
+ int m_iSeqNo; // the sequence number of the packet
+ int m_iRetries;
+ CMsgBuffer m_CurPacket[MAX_PACKETS]; // store for the packet
+};
+
+#endif // SOCKET_H \ No newline at end of file