mirror of
https://github.com/netchx/netch.git
synced 2026-03-14 17:43:18 +08:00
[Redirector] Add more feature
This commit is contained in:
@@ -2,12 +2,58 @@
|
||||
|
||||
#include "SocksHelper.h"
|
||||
|
||||
extern bool dnsProx;
|
||||
extern string dnsHost;
|
||||
extern USHORT dnsPort;
|
||||
|
||||
SOCKADDR_IN6 dnsAddr;
|
||||
|
||||
void HandleDNS(ENDPOINT_ID id, PSOCKADDR_IN6 target, char* packet, int length, PNF_UDP_OPTIONS option)
|
||||
void HandleClientDNS(ENDPOINT_ID id, PSOCKADDR_IN6 target, char* packet, int length, PNF_UDP_OPTIONS option)
|
||||
{
|
||||
auto remote = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (remote != INVALID_SOCKET)
|
||||
{
|
||||
int v6only = 0;
|
||||
|
||||
if (setsockopt(remote, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&v6only, sizeof(v6only)) != SOCKET_ERROR)
|
||||
{
|
||||
SOCKADDR_IN6 addr;
|
||||
IN6ADDR_SETANY(&addr);
|
||||
|
||||
if (bind(remote, (PSOCKADDR)&addr, sizeof(SOCKADDR_IN6)) != SOCKET_ERROR)
|
||||
{
|
||||
if (sendto(remote, packet, length, 0, (PSOCKADDR)&dnsAddr, (dnsAddr.sin6_family == AF_INET ? sizeof(SOCKADDR_IN) : sizeof(SOCKADDR_IN6))) == length)
|
||||
{
|
||||
timeval timeout{};
|
||||
timeout.tv_sec = 4;
|
||||
|
||||
fd_set fds;
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(remote, &fds);
|
||||
|
||||
int size = select(NULL, &fds, NULL, NULL, &timeout);
|
||||
if (size != 0 && size != SOCKET_ERROR)
|
||||
{
|
||||
char buffer[1024];
|
||||
|
||||
size = recvfrom(remote, buffer, sizeof(buffer), 0, NULL, NULL);
|
||||
if (size != 0 && size != SOCKET_ERROR)
|
||||
nf_udpPostReceive(id, (PBYTE)target, buffer, size, option);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (remote != INVALID_SOCKET)
|
||||
closesocket(remote);
|
||||
|
||||
delete target;
|
||||
delete[] packet;
|
||||
delete[] option;
|
||||
}
|
||||
|
||||
void HandleRemoteDNS(ENDPOINT_ID id, PSOCKADDR_IN6 target, char* packet, int length, PNF_UDP_OPTIONS option)
|
||||
{
|
||||
auto remote = new SocksHelper::UDP();
|
||||
if (remote->Associate())
|
||||
@@ -23,7 +69,7 @@ void HandleDNS(ENDPOINT_ID id, PSOCKADDR_IN6 target, char* packet, int length, P
|
||||
|
||||
int size = remote->Read(NULL, buffer, sizeof(buffer), &timeout);
|
||||
if (size != 0 && size != SOCKET_ERROR)
|
||||
nf_udpPostReceive(id, (unsigned char*)target, buffer, size, option);
|
||||
nf_udpPostReceive(id, (PBYTE)target, buffer, size, option);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -60,13 +106,9 @@ bool DNSHandler::INIT()
|
||||
bool DNSHandler::IsDNS(PSOCKADDR_IN6 target)
|
||||
{
|
||||
if (target->sin6_family == AF_INET)
|
||||
{
|
||||
return ((PSOCKADDR_IN)target)->sin_port == htons(53);
|
||||
}
|
||||
else
|
||||
{
|
||||
return target->sin6_port == htons(53);
|
||||
}
|
||||
}
|
||||
|
||||
void DNSHandler::CreateHandler(ENDPOINT_ID id, PSOCKADDR_IN6 target, const char* packet, int length, PNF_UDP_OPTIONS options)
|
||||
@@ -79,5 +121,8 @@ void DNSHandler::CreateHandler(ENDPOINT_ID id, PSOCKADDR_IN6 target, const char*
|
||||
memcpy(buffer, packet, length);
|
||||
memcpy(option, options, sizeof(NF_UDP_OPTIONS) + options->optionsLength - 1);
|
||||
|
||||
thread(HandleDNS, id, remote, buffer, length, option).detach();
|
||||
if (!dnsProx)
|
||||
thread(HandleClientDNS, id, remote, buffer, length, option).detach();
|
||||
else
|
||||
thread(HandleRemoteDNS, id, remote, buffer, length, option).detach();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user