Ping loop while brainstorming.
This commit is contained in:
parent
8eec2167c8
commit
d6b1c98cbd
@ -2,8 +2,10 @@
|
||||
|
||||
Dandelion ++ Gossip client logic
|
||||
"""
|
||||
import traceback
|
||||
from typing import TYPE_CHECKING
|
||||
from typing import Set
|
||||
from time import sleep
|
||||
|
||||
from queue import Queue
|
||||
|
||||
@ -11,7 +13,9 @@ if TYPE_CHECKING:
|
||||
from onionrblocks import Block
|
||||
from .peer import Peer
|
||||
|
||||
import logger
|
||||
import onionrplugins
|
||||
from .commands import GossipCommands
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -28,9 +32,37 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
|
||||
def gossip_client(
|
||||
peer_set: Set['Peer'],
|
||||
block_queue: Queue['Block'],
|
||||
dandelion_seed: bytes):
|
||||
return
|
||||
"""
|
||||
Gossip client does the following:
|
||||
|
||||
Stem new blocks we created or downloaded *during stem phase*
|
||||
Stream new blocks
|
||||
"""
|
||||
|
||||
remove_peers = []
|
||||
|
||||
while True:
|
||||
remove_peers.clear()
|
||||
for peer in peer_set:
|
||||
try:
|
||||
sock = peer.get_socket()
|
||||
except Exception:
|
||||
logger.warn("Lost connection to " + peer.transport_address)
|
||||
logger.warn(traceback.format_exc())
|
||||
remove_peers.append(peer)
|
||||
break
|
||||
sock.sendall(int(GossipCommands.PING).to_bytes(1, 'big'))
|
||||
if sock.recv(10) == b"PONG":
|
||||
print("Got ping at peer")
|
||||
while len(remove_peers):
|
||||
try:
|
||||
peer_set.remove(remove_peers.pop())
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
sleep(30)
|
||||
return
|
||||
|
@ -1,9 +1,10 @@
|
||||
from enum import Enum, auto
|
||||
from enum import IntEnum, auto
|
||||
|
||||
class GossipCommands(Enum):
|
||||
class GossipCommands(IntEnum):
|
||||
PING = 1
|
||||
ANNOUNCE = auto()
|
||||
PEER_EXCHANGE = auto()
|
||||
STREAM_BLOCKS = auto()
|
||||
PUT_BLOCKS = auto()
|
||||
CLOSE = auto()
|
||||
|
||||
|
@ -33,10 +33,19 @@ def gossip_server(
|
||||
|
||||
async def peer_connected(reader, writer):
|
||||
while True:
|
||||
cmd = asyncio.wait_for(await reader.read(1), 30)
|
||||
match cmd:
|
||||
try:
|
||||
cmd = await asyncio.wait_for(reader.read(1), 60)
|
||||
except asyncio.exceptions.CancelledError:
|
||||
writer.close()
|
||||
|
||||
cmd = int.from_bytes(cmd, 'big')
|
||||
if cmd == b'' or cmd == 0:
|
||||
continue
|
||||
match GossipCommands(cmd):
|
||||
case GossipCommands.PING:
|
||||
writer.write(b'PONG')
|
||||
case GossipCommands.CLOSE:
|
||||
writer.close()
|
||||
|
||||
await writer.drain()
|
||||
|
||||
|
@ -77,7 +77,7 @@ def on_bootstrap(api, data: Set[Peer] = None):
|
||||
sleep(0.1)
|
||||
|
||||
socks_address, socks_port = get_socks()[0]
|
||||
sleep(10)
|
||||
sleep(5)
|
||||
|
||||
for transport_address in bootstrap_nodes:
|
||||
config.reload()
|
||||
|
@ -4,7 +4,7 @@ import socks
|
||||
class TorPeer:
|
||||
|
||||
def __init__(self, socks_host, socks_port, onion_address):
|
||||
self.onion_address = onion_address
|
||||
self.transport_address = self.onion_address = onion_address
|
||||
self.socks_host = socks_host
|
||||
self.socks_port = socks_port
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user