Skip to content

Commit 7de621e

Browse files
committed
Counting for Less loss balancer.
1 parent 7b3f4b3 commit 7de621e

File tree

3 files changed

+17
-195
lines changed

3 files changed

+17
-195
lines changed

client.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ async def _send_ping_packet(self, server, is_ping=True):
168168
dynamic_data = f"P{int(time.time() % 60)}R{random.randint(100, 999)}".encode()
169169

170170
try:
171+
self.balancer.report_send(f"{server['resolver']}:{server['domain']}")
171172
query_packets = await self.dns_packet_parser.build_request_dns_query(
172173
domain=server["domain"],
173174
session_id=self.session_id,
@@ -190,7 +191,7 @@ async def _send_ping_packet(self, server, is_ping=True):
190191
self.logger.debug(f"Failed to send PING: {e}")
191192

192193
async def _process_received_packet(
193-
self, response_bytes: bytes
194+
self, response_bytes: bytes, addr=None
194195
) -> Tuple[Optional[dict], bytes]:
195196
"""
196197
Parse raw DNS response, extract VPN header, and return packet type alongside assembled data.
@@ -200,6 +201,17 @@ async def _process_received_packet(
200201
return None, b""
201202

202203
parsed = await self.dns_packet_parser.parse_dns_packet(response_bytes)
204+
if addr and parsed and parsed.get("questions"):
205+
try:
206+
qname = parsed["questions"][0].get("qName", "").lower()
207+
base_domain = next(
208+
(d for d in self.domains if qname.endswith(d.lower())), None
209+
)
210+
if base_domain:
211+
self.balancer.report_success(f"{addr[0]}:{base_domain}")
212+
except Exception as _:
213+
pass
214+
203215
if not parsed or not parsed.get("answers"):
204216
self.logger.debug(
205217
"<yellow>[PARSER]</yellow> DNS response contains no answers."
@@ -876,16 +888,16 @@ async def _rx_worker(self):
876888
self.logger.debug(
877889
f"<magenta>[RX]</magenta> Data from tunnel socket: {len(data)} bytes"
878890
)
879-
self.loop.create_task(self._process_and_route_incoming(data))
891+
self.loop.create_task(self._process_and_route_incoming(data, addr))
880892

881893
except asyncio.TimeoutError:
882894
continue
883895
except Exception as e:
884896
self.logger.debug(f"RX Worker error: {e}")
885897

886-
async def _process_and_route_incoming(self, data):
898+
async def _process_and_route_incoming(self, data, addr):
887899
"""Helper to process incoming data asynchronously."""
888-
parsed_header, returned_data = await self._process_received_packet(data)
900+
parsed_header, returned_data = await self._process_received_packet(data, addr)
889901
if parsed_header:
890902
await self._handle_server_response(parsed_header, returned_data)
891903

@@ -1019,6 +1031,7 @@ async def _send_single_packet(self, item):
10191031
return
10201032

10211033
for conn in target_conns:
1034+
self.balancer.report_send(f"{conn['resolver']}:{conn['domain']}")
10221035
query_packets = await self.dns_packet_parser.build_request_dns_query(
10231036
domain=conn["domain"],
10241037
session_id=self.session_id,

client_config.py.simple

Lines changed: 0 additions & 118 deletions
This file was deleted.

server_config.py.simple

Lines changed: 0 additions & 73 deletions
This file was deleted.

0 commit comments

Comments
 (0)