UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PacketHandler.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "Containers/Queue.h"
8#include "CoreMinimal.h"
10#include "HAL/UnrealMemory.h"
11#include "IPAddress.h"
12#include "Logging/LogMacros.h"
13#include "Math/UnrealMathSSE.h"
22#include "UObject/NameTypes.h"
23#include "UObject/UnrealNames.h"
24
25
27
28class FInternetAddr;
29class FDDoSDetection;
32// Forward declarations
35class PacketHandler;
37
38namespace UE
39{
40 namespace Net
41 {
42 class FNetConnectionFaultRecoveryBase;
43 }
44}
45
46#if !UE_BUILD_SHIPPING
48#endif
49
54// Delegate for allowing access to LowLevelSend, without a dependency upon Engine
56
57DECLARE_DELEGATE_ThreeParams(FPacketHandlerLowLevelSend, void* /* Data */, int32 /* CountBytes */, int32 /* CountBits */);
58
59// Delegate for allowing adding of packet handlers without defining them in an ini file
62
69
74
75
80namespace UE
81{
82 namespace Handler
83 {
87 enum class State : uint8
88 {
89 Uninitialized, // PacketHandler is uninitialized
90 InitializingComponents, // PacketHandler is initializing HandlerComponents
91 Initialized // PacketHandler and all HandlerComponents (if any) are initialized
92 };
93
97 enum class Mode : uint8
98 {
99 Client, // Clientside PacketHandler
100 Server // Serverside PacketHandler
101 };
102
103 namespace Component
104 {
108 enum class State : uint8
109 {
110 UnInitialized, // HandlerComponent not yet initialized
111 InitializedOnLocal, // Initialized on local instance
112 InitializeOnRemote, // Initialized on remote instance, not on local instance
113 Initialized // Initialized on both local and remote instances
114 };
115 }
116 }
117}
118
123{
126
129
131 bool bError;
132
133public:
135 : Data()
136 , CountBits(0)
137 , bError(false)
138 {
139 }
140
150};
151
225
240
241
244{
245 Success,
246 Error
247};
248
252class PacketHandler
253{
254public:
261
274
283
289 PACKETHANDLER_API void InitFaultRecovery(UE::Net::FNetConnectionFaultRecoveryBase* InFaultRecovery);
290
299
304
305
310
311
312 PACKETHANDLER_API void Tick(float DeltaTime);
313
321
329
330
331 // @todo #JohnB: Add runtime-calculated arrays for each packet pipeline type, to reduce redundant iterations,
332 // (there are 3x iterations now, 1 for each packet pipeline type), and to ignore inactive HandlerComponent's
333
334 // @todo #JohnB: The reserved packet bits needs to be handled differently for the 'High' functions, as they use SendBuffer,
335 // which normally is reduced in size by reserved packet bits.
336
337
348
359
360 // @todo: Don't deprecate, until after the NetDriver refactor
361 //UE_DEPRECATED(4.26, "Incoming now uses FReceivedPacketView.")
369
383
395 inline const ProcessedPacket Outgoing(uint8* Packet, int32 CountBits, FOutPacketTraits& Traits)
396 {
398 return Outgoing_Internal(Packet, CountBits, Traits, false, EmptyAddress);
399 }
400
401
402 // @todo: Don't deprecate, until after the NetDriver refactor
403 //UE_DEPRECATED(4.26, "IncomingConnectionless now uses FReceivedPacketView.")
410
420 {
421 PacketView.Traits.bConnectionlessPacket = true;
422
424 }
425
437 {
438 return Outgoing_Internal(Packet, CountBits, Traits, true, Address);
439 }
440
443
446
447 PACKETHANDLER_API void CountBytes(FArchive& Ar) const;
448
449protected:
450 UE_DEPRECATED(4.26, "Incoming_Internal now uses FReceivedPacketView")
452 {
454
456 PacketView.Address = Address;
457 PacketView.Traits.bConnectionlessPacket = bConnectionless;
458
460
461 if (Result == EIncomingResult::Success)
462 {
463 return ProcessedPacket(PacketView.DataView.GetMutableData(), PacketView.DataView.NumBits());
464 }
465 else
466 {
467 return ProcessedPacket(nullptr, 0, true);
468 }
469 }
470
478
490
491public:
492
503
504
509
516 {
517 QueuedRawPackets.Enqueue(PacketToQueue);
518 }
519
526 {
527 QueuedHandlerPackets.Enqueue(PacketToQueue);
528 }
529
537
546
553
560
567
574
575
582 inline void SetRawSend(bool bInEnabled)
583 {
584 bRawSend = bInEnabled;
585 }
586
590 inline bool GetRawSend()
591 {
592 return bRawSend;
593 }
594
598 inline bool IsFullyInitialized()
599 {
600 return State == UE::Handler::State::Initialized;
601 }
602
604 FDDoSDetection* GetDDoS() const { return DDoS; }
605
607 TSharedPtr<IAnalyticsProvider> GetProvider() const { return Provider; }
608
611
612
613private:
620
624 PACKETHANDLER_API void UpdateInitialState();
625
629 PACKETHANDLER_API void HandlerInitialized();
630
636 PACKETHANDLER_API void ReplaceIncomingPacket(FBitReader& ReplacementPacket);
637
643 PACKETHANDLER_API void RealignPacket(FBitReader& Packet);
644
645
646public:
649
650 UE_DEPRECATED(5.6, "PacketHandler AddComponent delegates are deprecated, use [PacketHandlerComponents] section in .ini file")
652 UE_DEPRECATED(5.6, "PacketHandler AddComponent delegates are deprecated, use [PacketHandlerComponents] section in .ini file")
654
655private:
656
658 UE::Handler::State State;
659
661 uint8 bRawSend:1;
662
664 uint8 bBeganHandshaking:1;
665
667 uint8 bConnectionlessHandler:1;
668
670 uint32 MaxPacketBits;
671
673 FDDoSDetection* DDoS;
674
676 FPacketHandlerLowLevelSendTraits LowLevelSendDel;
677
679 FPacketHandlerHandshakeComplete HandshakeCompleteDel;
680
682 FPacketHandlerNotifyAddHandler AddHandlerDel;
683
685 FBitWriter OutgoingPacket;
686
688 FBitReader IncomingPacket;
689
691 TArray<TSharedPtr<HandlerComponent>> HandlerComponents;
692
694 TSharedPtr<FEncryptionComponent> EncryptionComponent;
695
697 TArray<BufferedPacket*> BufferedPackets;
698
700 TQueue<BufferedPacket*> QueuedPackets;
701
703 TQueue<BufferedPacket*> QueuedRawPackets;
704
706 TQueue<BufferedPacket*> QueuedHandlerPackets;
707
709 TArray<BufferedPacket*> BufferedConnectionlessPackets;
710
712 TQueue<BufferedPacket*> QueuedConnectionlessPackets;
713
715 TSharedPtr<ReliabilityHandlerComponent> ReliabilityComponent;
716
719
722};
723
728{
729 friend class PacketHandler;
730
731public:
736
741
746
750 PACKETHANDLER_API virtual bool IsActive() const;
751
755 virtual bool IsValid() const = 0;
756
760 PACKETHANDLER_API bool IsInitialized() const;
761
765 bool RequiresHandshake() const
766 {
767 return bRequiresHandshake;
768 }
769
774 {
775 return bRequiresReliability;
776 }
777
778 // Delay deprecation for initial checkin
779 //UE_DEPRECATED(5.0, "Use the version of 'HandlerComponent::Incoming' which takes 'FIncomingPacketRef' instead")
780 virtual void Incoming(FBitReader& Packet)
781 {
782 }
783
790 {
791 // By default, call the deprecated version unless overridden (derived classes should NOT call the parent Incoming function)
793 Incoming(PacketRef.Packet);
795 }
796
803 virtual void Outgoing(FBitWriter& Packet, FOutPacketTraits& Traits)
804 {
805 }
806
815
824 {
825 }
826
827
834 virtual bool CanReadUnaligned() const
835 {
836 return false;
837 }
838
839
843 virtual void Initialize() = 0;
844
850 virtual void InitFaultRecovery(UE::Net::FNetConnectionFaultRecoveryBase* InFaultRecovery)
851 {
852 }
853
857 virtual void NotifyHandshakeBegin()
858 {
859 }
860
864 virtual void Tick(float DeltaTime) {}
865
871 PACKETHANDLER_API virtual void SetActive(bool Active);
872
881 virtual int32 GetReservedPacketBits() const = 0;
882
884 FName GetName() const { return Name; }
885
890 virtual void NotifyAnalyticsProvider() {}
891
892 PACKETHANDLER_API virtual void CountBytes(FArchive& Ar) const;
893
894protected:
901
906
907
908public:
911
912protected:
915
918
921
924
925private:
927 bool bActive;
928
930 bool bInitialized;
931
932 /* The name of this component */
933 FName Name;
934};
935
940{
941public:
942 /* Creates an instance of this component */
944 {
945 return nullptr;
946 }
947
948 PACKETHANDLER_API virtual void StartupModule() override;
949
950 PACKETHANDLER_API virtual void ShutdownModule() override;
951};
OODEFFUNC typedef const char * file
Definition oodle2.h:678
#define check(expr)
Definition AssertionMacros.h:314
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_DELEGATE(DelegateName)
Definition DelegateCombinations.h:20
#define DECLARE_DELEGATE_OneParam(DelegateName, Param1Type)
Definition DelegateCombinations.h:48
#define DECLARE_DELEGATE_ThreeParams(DelegateName, Param1Type, Param2Type, Param3Type)
Definition DelegateCombinations.h:66
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
EIncomingResult
Definition PacketHandler.h:244
PACKETHANDLER_API bool GPacketHandlerDiscardTimeguardMeasurement
Definition PacketHandler.cpp:43
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
virtual void CountBytes(SIZE_T InNum, SIZE_T InMax)
Definition Archive.h:125
Definition DDoSDetection.h:173
Definition EncryptionComponent.h:14
Definition IPAddress.h:22
Definition NameTypes.h:617
Definition NetAnalytics.h:324
Definition PacketHandler.h:940
virtual TSharedPtr< HandlerComponent > CreateComponentInstance(FString &Options)
Definition PacketHandler.h:943
Definition PacketHandler.h:728
PacketHandler * Handler
Definition PacketHandler.h:910
bool bRequiresReliability
Definition PacketHandler.h:923
virtual void NotifyHandshakeBegin()
Definition PacketHandler.h:857
virtual void InitFaultRecovery(UE::Net::FNetConnectionFaultRecoveryBase *InFaultRecovery)
Definition PacketHandler.h:850
virtual void Incoming(FIncomingPacketRef PacketRef)
Definition PacketHandler.h:789
virtual void IncomingConnectionless(FIncomingPacketRef PacketRef)
Definition PacketHandler.h:812
bool bRequiresHandshake
Definition PacketHandler.h:920
bool RequiresHandshake() const
Definition PacketHandler.h:765
FName GetName() const
Definition PacketHandler.h:884
virtual void Incoming(FBitReader &Packet)
Definition PacketHandler.h:780
virtual void Tick(float DeltaTime)
Definition PacketHandler.h:864
virtual PACKETHANDLER_API ~HandlerComponent()
virtual void OutgoingConnectionless(const TSharedPtr< const FInternetAddr > &Address, FBitWriter &Packet, FOutPacketTraits &Traits)
Definition PacketHandler.h:823
uint32 MaxOutgoingBits
Definition PacketHandler.h:917
virtual bool CanReadUnaligned() const
Definition PacketHandler.h:834
UE::Handler::Component::State State
Definition PacketHandler.h:914
virtual void Outgoing(FBitWriter &Packet, FOutPacketTraits &Traits)
Definition PacketHandler.h:803
bool RequiresReliability() const
Definition PacketHandler.h:773
virtual void Initialize()=0
virtual void NotifyAnalyticsProvider()
Definition PacketHandler.h:890
virtual int32 GetReservedPacketBits() const =0
virtual bool IsValid() const =0
Definition IAnalyticsProvider.h:52
Definition ModuleInterface.h:14
Definition PacketHandler.Build.cs:7
PACKETHANDLER_API void NotifyAnalyticsProvider(TSharedPtr< IAnalyticsProvider > InProvider, TSharedPtr< FNetAnalyticsAggregator > InAggregator)
Definition PacketHandler.cpp:258
void QueueHandlerPacketForSending(BufferedPacket *PacketToQueue)
Definition PacketHandler.h:525
void SetRawSend(bool bInEnabled)
Definition PacketHandler.h:582
const ProcessedPacket Incoming_Internal(uint8 *Packet, int32 CountBytes, bool bConnectionless, const TSharedPtr< const FInternetAddr > &Address)
Definition PacketHandler.h:451
PACKETHANDLER_API BufferedPacket * GetQueuedPacket()
Definition PacketHandler.cpp:1164
FDDoSDetection * GetDDoS() const
Definition PacketHandler.h:604
PACKETHANDLER_API TSharedPtr< FEncryptionComponent > GetEncryptionComponent()
Definition PacketHandler.cpp:479
bool IsFullyInitialized()
Definition PacketHandler.h:598
PACKETHANDLER_API void CountBytes(FArchive &Ar) const
Definition PacketHandler.cpp:497
PACKETHANDLER_API void InitFaultRecovery(UE::Net::FNetConnectionFaultRecoveryBase *InFaultRecovery)
Definition PacketHandler.cpp:250
static PACKETHANDLER_API bool DoesAnyProfileHaveComponent(const FString &InComponentName)
Definition PacketHandler.cpp:1130
PACKETHANDLER_API void HandlerComponentInitialized(HandlerComponent *InComponent)
Definition PacketHandler.cpp:1088
PACKETHANDLER_API TSharedPtr< HandlerComponent > GetComponentByName(FName ComponentName) const
Definition PacketHandler.cpp:484
static PACKETHANDLER_API FPacketHandlerAddComponentDelegate & GetAddComponentDelegate()
Definition PacketHandler.cpp:159
PACKETHANDLER_API void InitializeDelegates(FPacketHandlerLowLevelSendTraits InLowLevelSendDel, FPacketHandlerNotifyAddHandler InAddHandlerDel=FPacketHandlerNotifyAddHandler())
Definition PacketHandler.cpp:243
PACKETHANDLER_API BufferedPacket * GetQueuedConnectionlessPacket()
Definition PacketHandler.cpp:1182
EIncomingResult IncomingConnectionless(FReceivedPacketView &PacketView)
Definition PacketHandler.h:419
const ProcessedPacket Incoming(uint8 *Packet, int32 CountBytes)
Definition PacketHandler.h:362
EIncomingResult Incoming(FReceivedPacketView &PacketView)
Definition PacketHandler.h:379
PACKETHANDLER_API void IncomingHigh(FBitReader &Reader)
Definition PacketHandler.cpp:469
TSharedPtr< IAnalyticsProvider > GetProvider() const
Definition PacketHandler.h:607
const ProcessedPacket Outgoing(uint8 *Packet, int32 CountBits, FOutPacketTraits &Traits)
Definition PacketHandler.h:395
bool GetRawSend()
Definition PacketHandler.h:590
PACKETHANDLER_API void BeginHandshaking(FPacketHandlerHandshakeComplete InHandshakeDel=FPacketHandlerHandshakeComplete())
Definition PacketHandler.cpp:303
static PACKETHANDLER_API bool DoesProfileHaveComponent(const FName InNetDriverName, const FString &InComponentName)
Definition PacketHandler.cpp:1148
PACKETHANDLER_API void OutgoingHigh(FBitWriter &Writer)
Definition PacketHandler.cpp:474
UE::Handler::Mode Mode
Definition PacketHandler.h:648
PACKETHANDLER_API void InitializeComponents()
Definition PacketHandler.cpp:275
void QueuePacketForRawSending(BufferedPacket *PacketToQueue)
Definition PacketHandler.h:515
const ProcessedPacket OutgoingConnectionless(const TSharedPtr< const FInternetAddr > &Address, uint8 *Packet, int32 CountBits, FOutPacketTraits &Traits)
Definition PacketHandler.h:436
PACKETHANDLER_API BufferedPacket * GetQueuedRawPacket()
Definition PacketHandler.cpp:1173
PACKETHANDLER_API const ProcessedPacket Outgoing_Internal(uint8 *Packet, int32 CountBits, FOutPacketTraits &Traits, bool bConnectionless, const TSharedPtr< const FInternetAddr > &Address)
Definition PacketHandler.cpp:728
TSharedPtr< FNetAnalyticsAggregator > GetAggregator() const
Definition PacketHandler.h:610
PACKETHANDLER_API void SendHandlerPacket(HandlerComponent *InComponent, FBitWriter &Writer, FOutPacketTraits &Traits)
Definition PacketHandler.cpp:939
PACKETHANDLER_API void AddHandler(TSharedPtr< HandlerComponent > &NewHandler, bool bDeferInitialize=false)
Definition PacketHandler.cpp:323
const ProcessedPacket IncomingConnectionless(const TSharedPtr< const FInternetAddr > &Address, uint8 *Packet, int32 CountBytes)
Definition PacketHandler.h:404
PACKETHANDLER_API int32 GetTotalReservedPacketBits()
Definition PacketHandler.cpp:1191
static PACKETHANDLER_API FPacketHandlerAddComponentByNameDelegate & GetAddComponentByNameDelegate()
Definition PacketHandler.cpp:153
Definition ReliabilityHandlerComponent.Build.cs:7
Definition Array.h:670
Definition Queue.h:48
bool Enqueue(const FElementType &Item)
Definition Queue.h:123
Definition SharedPointer.h:692
@ Bytes
Definition PacketView.h:39
State
Definition PacketHandler.h:109
State
Definition PacketHandler.h:88
Mode
Definition PacketHandler.h:98
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
Definition PacketHandler.h:156
uint32 CountBits
Definition PacketHandler.h:161
uint8 * Data
Definition PacketHandler.h:158
TSharedPtr< const FInternetAddr > Address
Definition PacketHandler.h:173
double ResendTime
Definition PacketHandler.h:167
PACKETHANDLER_API ~BufferedPacket()
Definition PacketHandler.cpp:92
HandlerComponent * FromComponent
Definition PacketHandler.h:176
uint32 Id
Definition PacketHandler.h:170
void CountBytes(FArchive &Ar) const
Definition PacketHandler.h:219
FOutPacketTraits Traits
Definition PacketHandler.h:164
BufferedPacket(TSharedPtr< const FInternetAddr > InAddress, uint8 *InCopyData, uint32 InCountBits, FOutPacketTraits &InTraits, double InResendTime=0.0, uint32 InId=0)
Definition PacketHandler.h:208
BufferedPacket(uint8 *InCopyData, uint32 InCountBits, FOutPacketTraits &InTraits, double InResendTime=0.0, uint32 InId=0)
Definition PacketHandler.h:194
Definition BitReader.h:25
Definition BitWriter.h:22
Definition PacketTraits.h:47
Definition PacketHandler.h:230
FInPacketTraits & Traits
Definition PacketHandler.h:238
FBitReader & Packet
Definition PacketHandler.h:232
const TSharedPtr< const FInternetAddr > & Address
Definition PacketHandler.h:235
static constexpr UE_FORCEINLINE_HINT T DivideAndRoundUp(T Dividend, T Divisor)
Definition UnrealMathUtility.h:694
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition PacketTraits.h:21
Definition PacketView.h:113
FPacketDataView DataView
Definition PacketView.h:115
Definition PacketHandler.h:123
bool bError
Definition PacketHandler.h:131
uint8 * Data
Definition PacketHandler.h:125
ProcessedPacket(uint8 *InData, int32 InCountBits, bool bInError=false)
Definition PacketHandler.h:144
int32 CountBits
Definition PacketHandler.h:128
ProcessedPacket()
Definition PacketHandler.h:134