crashfix: update/close listening port

This commit is contained in:
monsieurgustav
2014-10-12 18:57:19 +02:00
parent 90b057f859
commit 4a503995ea
@@ -27,13 +27,12 @@ void UOscDispatcher::Listen(uint32_t port)
{ {
if(_currentPort != port) if(_currentPort != port)
{ {
delete _socket; Stop();
delete _socketReceiver;
_socket = FUdpSocketBuilder(TEXT("OscListener")).BoundToAddress(FIPv4Address::Any).BoundToPort(port).Build(); _socket = FUdpSocketBuilder(TEXT("OscListener")).AsNonBlocking().BoundToAddress(FIPv4Address::Any).BoundToPort(port).Build();
if(_socket) if(_socket)
{ {
_socketReceiver = new FUdpSocketReceiver(_socket, FTimespan(0, 0, 0, 10), TEXT("OSCListener")); _socketReceiver = new FUdpSocketReceiver(_socket, FTimespan::FromMilliseconds(100), TEXT("OSCListener"));
_socketReceiver->OnDataReceived().BindUObject(this, &UOscDispatcher::Callback); _socketReceiver->OnDataReceived().BindUObject(this, &UOscDispatcher::Callback);
_currentPort = port; _currentPort = port;
@@ -49,23 +48,15 @@ void UOscDispatcher::Listen(uint32_t port)
void UOscDispatcher::Stop() void UOscDispatcher::Stop()
{ {
UE_LOG(LogOSC, Display, TEXT("Stop listening")); UE_LOG(LogOSC, Display, TEXT("Stop listening"));
delete _socketReceiver;
_socketReceiver = nullptr;
if(_socket) if(_socket)
{ {
_socket->Close(); ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(_socket);
_socket = nullptr;
} }
if(_socketReceiver)
{
_socketReceiver->OnDataReceived().Unbind();
_socketReceiver->Stop();
// wait longer than the socket read wait time, or it will crash.
FPlatformProcess::Sleep(0.1f);
}
delete _socket;
delete _socketReceiver;
_socket = nullptr;
_socketReceiver = nullptr;
_currentPort = 0; _currentPort = 0;
} }
@@ -142,23 +133,31 @@ static void SendBundle(TCircularQueue<std::pair<FName, FOscDataStruct>> & _pendi
void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint&) void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint&)
{ {
UE_LOG(LogOSC, Verbose, TEXT("OSC Received")); UE_LOG(LogOSC, Verbose, TEXT("OSC Received"));
const osc::ReceivedPacket packet((const char *)data->GetData(), data->Num()); try
if(packet.IsBundle())
{ {
SendBundle(_pendingMessages, osc::ReceivedBundle(packet)); const osc::ReceivedPacket packet((const char *)data->GetData(), data->Num());
}
else if(packet.IsBundle())
{ {
SendMessage(_pendingMessages, osc::ReceivedMessage(packet)); SendBundle(_pendingMessages, osc::ReceivedBundle(packet));
} }
else
{
SendMessage(_pendingMessages, osc::ReceivedMessage(packet));
}
if(!_pendingMessages.IsEmpty()) if(!_pendingMessages.IsEmpty())
{
FSimpleDelegateGraphTask::CreateAndDispatchWhenReady(
FSimpleDelegateGraphTask::FDelegate::CreateUObject(this, &UOscDispatcher::CallbackMainThread),
TEXT("OscDispatcherProcessMessages"),
nullptr,
ENamedThreads::GameThread);
}
}
catch(osc::MalformedPacketException &e)
{ {
FSimpleDelegateGraphTask::CreateAndDispatchWhenReady( UE_LOG(LogOSC, Warning, TEXT("Malformed OSC message: %s"), e.what());
FSimpleDelegateGraphTask::FDelegate::CreateUObject(this, &UOscDispatcher::CallbackMainThread),
TEXT("OscDispatcherProcessMessages"),
nullptr,
ENamedThreads::GameThread);
} }
} }