116 lines
3.3 KiB
C++
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;
|
|
}
|