I hate this "header"

This commit is contained in:
Maxim Khomutov 2023-07-07 17:56:01 +03:00
parent c4a871d181
commit 3defc99389
2 changed files with 28 additions and 15 deletions

View File

@ -39,17 +39,24 @@ class Client:
def kick(self, reason): def kick(self, reason):
self.log.info(f"Client: \"IP: {self.addr!r}; ID: {self.cid}\" - kicked with reason: \"{reason}\"") self.log.info(f"Client: \"IP: {self.addr!r}; ID: {self.cid}\" - kicked with reason: \"{reason}\"")
self.socket.send(b"K" + bytes(reason, "utf-8")) self.tcp_send(b"K" + bytes(reason, "utf-8"))
self.socket.close() self.socket.close()
self.alive = False self.alive = False
def tcp_send(self, data): def tcp_send(self, data):
header = b"C\x00\x00\x00\x00"
# size = len(data) # TNetwork.cpp; Line: 383
# to_send = bytearray(size + len(data)) # BEAMP TCP protocol sends a header of 4 bytes, followed by the data.
# to_send[0:len(data)] = size.to_bytes(len(data), byteorder='big') # [][][][][][]...[]
# to_send[len(data):] = data # ^------^^---...-^
self.socket.send(header + b"\x00" + data + b"\x00") # size data
data = data.replace(b" ", b"_")
if len(data) == 10:
data += b"."
header = len(data).to_bytes(4, "little")
self.log.debug(f'len(data) {len(data)}; header: {header}; send {header + data}')
self.socket.send(header + data)
class Core: class Core:
@ -64,6 +71,12 @@ class Core:
self.tcp = TCPServer self.tcp = TCPServer
self.udp = UDPServer self.udp = UDPServer
def get_client(self, sock=None, cid=None):
if cid:
return self.clients.get(cid)
if sock:
return self.clients.get(sock.getsockname())
def create_client(self, *args, **kwargs): def create_client(self, *args, **kwargs):
cl = Client(*args, **kwargs) cl = Client(*args, **kwargs)
self.clients_counter += 1 self.clients_counter += 1

View File

@ -5,6 +5,7 @@
# Licence: FPA # Licence: FPA
# (c) kuitoi.su 2023 # (c) kuitoi.su 2023
import asyncio import asyncio
import socket
from asyncio import StreamWriter, AbstractEventLoop, StreamReader from asyncio import StreamWriter, AbstractEventLoop, StreamReader
from asyncio.trsock import TransportSocket from asyncio.trsock import TransportSocket
@ -12,15 +13,14 @@ from core import utils
from .tcp_server import TCPServer from .tcp_server import TCPServer
from .udp_server import UDPServer from .udp_server import UDPServer
class Client: class Client:
def __init__(self, reader: StreamReader, writer: StreamWriter):
self.cid: int = 0 def __init__(self, sock: socket.socket):
self.nick: str = None self.cid = 0
self.nick = None
self.log = utils.get_logger("client") self.log = utils.get_logger("client")
self.writer: StreamWriter = writer self.addr = sock.getsockname()
self.reader: StreamReader = reader self.socket = sock
self.addr: tuple = writer.get_extra_info('peername') self.loop = asyncio.get_event_loop()
self.socket: TransportSocket = writer.get_extra_info('socket')
self.loop: AbstractEventLoop = asyncio.get_event_loop()
self.alive = True self.alive = True
def is_disconnected(self) -> bool: ... def is_disconnected(self) -> bool: ...
def kick(self, reason: str) -> None: ... def kick(self, reason: str) -> None: ...