bool FLiveEditorManager::ConnectToRemoteHost( FString IPAddress ) { IPAddress.Replace( TEXT(" "), TEXT("") ); TArray<FString> Parts; IPAddress.ParseIntoArray( Parts, TEXT("."), true ); if ( Parts.Num() != 4 ) return false; uint8 NumericParts[4]; for ( int32 i = 0; i < 4; ++i ) { NumericParts[i] = FCString::Atoi( *Parts[i] ); } FSocket* Socket = FTcpSocketBuilder(TEXT("FLiveEditorManager.RemoteConnection")); FIPv4Endpoint Endpoint(FIPv4Address(NumericParts[0], NumericParts[1], NumericParts[2], NumericParts[3]), LIVEEDITORLISTENSERVER_DEFAULT_PORT); if ( Socket->Connect(*Endpoint.ToInternetAddr()) ) { RemoteConnections.Add(IPAddress, Socket); return true; } else { return false; } }
void FMakeshiftServer::Init() { ISocketSubsystem* SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM); if (SocketSubsystem != nullptr) { FString SocketDescription("MakeshiftServerSocket"); FIPv4Endpoint Endpoint(FIPv4Address(192, 168, 1, 205), 9915); UE_LOG_ONLINE(Warning, TEXT("Connecting to %s"), *Endpoint.ToString()); //Socket = FTcpSocketBuilder(*SocketName).BoundToEndpoint(Endpoint).Build(); bool Error = true; Socket = SocketSubsystem->CreateSocket(NAME_Stream, *SocketDescription, true); if (Socket != nullptr) { Error = !Socket->Connect(*SocketSubsystem->CreateInternetAddr(Endpoint.GetAddress().GetValue(), Endpoint.GetPort())); } if (Error) { UE_LOG_ONLINE(Warning, TEXT("Failed to connect to %s"), *Endpoint.ToString()); } else { int32 sent; char data[] = "hello there"; Socket->Send(reinterpret_cast<const uint8 *>(data), 5, sent); UE_LOG_ONLINE(Warning, TEXT("Sent %d bytes"), sent); } } }
UOscDispatcher::UOscDispatcher(const class FPostConstructInitializeProperties& PCIP) : Super(PCIP), _listening(FIPv4Address(0), 0), _socket(nullptr), _socketReceiver(nullptr), _pendingMessages(64) { }
bool UNetworkManager::Start(int32 InPortNum) // Restart the server if configuration changed { if (InPortNum == this->PortNum && this->bIsListening) return true; // Already started if (ConnectionSocket) // Release previous connection { ConnectionSocket->Close(); ConnectionSocket = NULL; } if (TcpListener) // Delete previous configuration first { UE_LOG(LogUnrealCV, Warning, TEXT("Stop previous server")); TcpListener->Stop(); // TODO: test the robustness, will this operation successful? delete TcpListener; } this->PortNum = InPortNum; // Start a new TCPListener FIPv4Address IPAddress = FIPv4Address(0, 0, 0, 0); // int32 PortNum = this->PortNum; // Make this configuable FIPv4Endpoint Endpoint(IPAddress, PortNum); FSocket* ServerSocket = FTcpSocketBuilder(TEXT("FTcpListener server")) // TODO: Need to realease this socket // .AsReusable() .BoundToEndpoint(Endpoint) .Listening(8); if (ServerSocket) { int32 NewSize = 0; ServerSocket->SetReceiveBufferSize(2 * 1024 * 1024, NewSize); } else { this->bIsListening = false; UE_LOG(LogUnrealCV, Warning, TEXT("Cannot start listening on port %d, Port might be in use"), PortNum); return false; } TcpListener = new FTcpListener(*ServerSocket); // TcpListener = new FTcpListener(Endpoint); // This will be released after start // In FSocket, when a FSocket is set as reusable, it means SO_REUSEADDR, not SO_REUSEPORT. see SocketsBSD.cpp TcpListener->OnConnectionAccepted().BindUObject(this, &UNetworkManager::Connected); if (TcpListener->Init()) { this->bIsListening = true; UE_LOG(LogUnrealCV, Warning, TEXT("Start listening on %d"), PortNum); return true; } else { this->bIsListening = false; UE_LOG(LogUnrealCV, Error, TEXT("Can not start listening on port %d"), PortNum); return false; } }
void UOscDispatcher::Stop() { UE_LOG(LogOSC, Display, TEXT("Stop listening")); delete _socketReceiver; _socketReceiver = nullptr; if(_socket) { ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(_socket); _socket = nullptr; } _listening = std::make_pair(FIPv4Address(0), 0); }
bool FIPv4AddressTest::RunTest( const FString& Parameters ) { // component access must be correct FIPv4Address a1_1 = FIPv4Address(1, 2, 3, 4); TestEqual<uint8>(TEXT("Byte 0 of 1.2.3.4 must be 4"), a1_1.GetByte(0), 4); TestEqual<uint8>(TEXT("Byte 1 of 1.2.3.4 must be 3"), a1_1.GetByte(1), 3); TestEqual<uint8>(TEXT("Byte 2 of 1.2.3.4 must be 2"), a1_1.GetByte(2), 2); TestEqual<uint8>(TEXT("Byte 3 of 1.2.3.4 must be 1"), a1_1.GetByte(3), 1); // link local addresses must be recognized FIPv4Address a2_1 = FIPv4Address(169, 254, 0, 1); FIPv4Address a2_2 = FIPv4Address(168, 254, 0, 1); FIPv4Address a2_3 = FIPv4Address(169, 253, 0, 1); TestTrue(TEXT("169.254.0.1 must be a link local address"), a2_1.IsLinkLocal()); TestFalse(TEXT("168.254.0.1 must not be a link local address"), a2_2.IsLinkLocal()); TestFalse(TEXT("169.253.0.1 must not be a link local address"), a2_3.IsLinkLocal()); // loopback addresses must be recognized FIPv4Address a3_1 = FIPv4Address(127, 0, 0, 1); FIPv4Address a3_2 = FIPv4Address(128, 0, 0, 1); TestTrue(TEXT("127.0.0.1 must be a loopback address"), a3_1.IsLoopbackAddress()); TestFalse(TEXT("128.0.0.1 must not be a loopback address"), a3_2.IsLoopbackAddress()); // multicast addresses must be recognized FIPv4Address a4_1 = FIPv4Address(223, 255, 255, 255); FIPv4Address a4_2 = FIPv4Address(224, 0, 0, 0); FIPv4Address a4_3 = FIPv4Address(239, 255, 255, 255); FIPv4Address a4_4 = FIPv4Address(240, 0, 0, 0); TestFalse(TEXT("223.255.255.255 must not be a multicast address"), a4_1.IsMulticastAddress()); TestTrue(TEXT("224.0.0.0 must be a multicast address"), a4_2.IsMulticastAddress()); TestTrue(TEXT("239.255.255.255 must be a multicast address"), a4_3.IsMulticastAddress()); TestFalse(TEXT("240.0.0.0 must not be a multicast address"), a4_4.IsMulticastAddress()); // string conversion FIPv4Address a5_1 = FIPv4Address(1, 2, 3, 4); TestEqual<FString>(TEXT("String conversion (1.2.3.4)"), a5_1.ToText().ToString(), TEXT("1.2.3.4")); // parsing valid strings must succeed FIPv4Address a6_1 = FIPv4Address(1, 2, 3, 4); FIPv4Address a6_2; TestTrue(TEXT("Parsing valid strings must succeed (1.2.3.4)"), FIPv4Address::Parse(TEXT("1.2.3.4"), a6_2)); TestEqual(TEXT("Parsing valid strings must result in correct value (1.2.3.4)"), a6_2, a6_1); // parsing invalid strings must fail FIPv4Address a7_1; TestFalse(TEXT("Parsing invalid strings must fail (1.2.3)"), FIPv4Address::Parse(TEXT("1.2.3"), a6_2)); // site local addresses must be recognized FIPv4Address a8_1 = FIPv4Address(10, 0, 0, 1); FIPv4Address a8_2 = FIPv4Address(172, 16, 0, 1); FIPv4Address a8_3 = FIPv4Address(192, 168, 0, 1); TestTrue(TEXT("10.0.0.1 must be a site local address"), a8_1.IsSiteLocalAddress()); TestTrue(TEXT("172.16.0.1 must be a site local address"), a8_2.IsSiteLocalAddress()); TestTrue(TEXT("192.168.0.1 must be a site local address"), a8_3.IsSiteLocalAddress()); FIPv4Address a8_4 = FIPv4Address(11, 0, 0, 1); FIPv4Address a8_5 = FIPv4Address(173, 16, 0, 1); FIPv4Address a8_6 = FIPv4Address(172, 17, 0, 1); FIPv4Address a8_7 = FIPv4Address(193, 168, 0, 1); FIPv4Address a8_8 = FIPv4Address(192, 169, 0, 1); TestFalse(TEXT("11.0.0.1 must not be a site local address"), a8_4.IsSiteLocalAddress()); TestFalse(TEXT("173.16.0.1 must not be a site local address"), a8_5.IsSiteLocalAddress()); TestFalse(TEXT("172.17.0.1 must not be a site local address"), a8_6.IsSiteLocalAddress()); TestFalse(TEXT("193.168.0.1 must not be a site local address"), a8_7.IsSiteLocalAddress()); TestFalse(TEXT("192.169.0.1 must not be a site local address"), a8_8.IsSiteLocalAddress()); return true; }