binding to a delegate should definitely not be done in the constructor of any object. It should be done on an instance of a Pawn once when required, usually during BeginPlay. The constructor is only meant to set up the class itself without accessing other objects (can be dangerous). In UE there is another reason, read this:
This should live on BeginPlay as well:
UdpComp->OpenReceiveSocket(TEXT("127.0.0.1"), 5228);
It’s hard to tell what is going on without seeing an entire call stack. If you put a breakpoint before the moment it would assert, can you find new information in previous steps listed in the callstack?