Files
UE_SpaceStudio/InteractiveControl/Plugins/SimpleUDPTCPSocketClient/Source/SocketClient/Private/DNSClientSocketClient.cpp
T

116 lines
3.3 KiB
C++

// Copyright 2017-2019 David Romanski (Socke). All Rights Reserved.
#include "DNSClientSocketClient.h"
UDNSClientSocketClient::UDNSClientSocketClient(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer) {
}
void UDNSClientSocketClient::resolveDomain(ISocketSubsystem* socketSubSystem, FString domainP, bool useDNSCache, FString dnsIP) {
domain = domainP;
resolving = true;
if (useDNSCache) {
if (dnsCache.Find(domain) != nullptr) {
ip = *dnsCache.Find(domain);
resolving = false;
return;
}
}
FIPv4Endpoint Endpoint;
FString socketName;
//FIPv4Endpoint::Parse("127.0.0.1:12345", Endpoint);
//socket = FUdpSocketBuilder(*socketName).AsReusable().WithBroadcast().BoundToEndpoint(Endpoint);
socket = FUdpSocketBuilder(*socketName).AsReusable().WithBroadcast();
if (socket == nullptr || socket == NULL) {
UE_LOG(LogTemp, Error, TEXT("UE4 could not init a UDP socket to resolve %s on %s."), *domain, *dnsIP);
resolving = false;
return;
}
else {
FTimespan ThreadWaitTime = FTimespan::FromMilliseconds(100);
FUdpSocketReceiver* udpSocketReceiver = new FUdpSocketReceiver(socket, ThreadWaitTime, TEXT("UE4 DNSClient"));
udpSocketReceiver->OnDataReceived().BindUObject(this, &UDNSClientSocketClient::UDPReceiver);
udpSocketReceiver->Start();
TSharedRef<FInternetAddr> addr = socketSubSystem->CreateInternetAddr();
bool bIsValid;
addr->SetIp(*dnsIP, bIsValid);
addr->SetPort(53);
if (bIsValid) {
TArray<unsigned char> dnsRequest;
//id (ramdom choose)
dnsRequest.Add(0x22);
dnsRequest.Add(0x76);
//head
dnsRequest.Add(0x1);
dnsRequest.Add(0x0);
dnsRequest.Add(0x0);
dnsRequest.Add(0x1);
dnsRequest.Add(0x0);
dnsRequest.Add(0x0);
dnsRequest.Add(0x0);
dnsRequest.Add(0x0);
dnsRequest.Add(0x0);
dnsRequest.Add(0x0);
//domain
//split in domain parts than add the length as byte and the part as bytes
TArray<FString> domainParts;
domain.ParseIntoArray(domainParts, TEXT("."), true);
for (int i = 0; i < domainParts.Num(); i++) {
FTCHARToUTF8 Convert(*domainParts[i]);
dnsRequest.Add(Convert.Length());
dnsRequest.Append((uint8*)Convert.Get(), Convert.Length());
}
//foot
dnsRequest.Add(0x0);
dnsRequest.Add(0x0);
dnsRequest.Add(0x1);
dnsRequest.Add(0x0);
dnsRequest.Add(0x1);
int32 sent;
socket->SendTo((uint8*)dnsRequest.GetData(), dnsRequest.Num(), sent, *addr);
}
}
}
void UDNSClientSocketClient::UDPReceiver(const FArrayReaderPtr& ArrayReaderPtr, const FIPv4Endpoint& EndPt) {
//TSharedPtr<FInternetAddr> peerAddr = EndPt.ToInternetAddr();
//FString ip = peerAddr->ToString(false);
//int32 port = peerAddr->GetPort();
////UE_LOG(LogTemp, Error, TEXT("peerAddr:%s port:%i"), *peerAddr->ToString(false), peerAddr->GetPort());
TArray<uint8> byteArray;
byteArray.Append(ArrayReaderPtr->GetData(), ArrayReaderPtr->Num());
FString ipAdress;
if (byteArray.Num() > 10) {
for (int32 i = (byteArray.Num() - 4); i < byteArray.Num(); i++) {
uint32 ipTmp = byteArray.GetData()[i] << 0;
ipAdress += FString::FromInt(ipTmp) + ".";
}
}
ipAdress.RemoveFromEnd(".");
//UE_LOG(LogTemp, Display, TEXT("DNS Resolved IP:%s"), *recvMessage);
ip = ipAdress;
dnsCache.Add(domain, ip);
resolving = false;
}
bool UDNSClientSocketClient::isResloving() {
return resolving;
}
FString UDNSClientSocketClient::getIP() {
return ip;
}