Changeset View
Changeset View
Standalone View
Standalone View
test/functional/test_framework/mininode.py
Show All 14 Lines | |||||
""" | """ | ||||
import asyncore | import asyncore | ||||
from collections import defaultdict | from collections import defaultdict | ||||
from io import BytesIO | from io import BytesIO | ||||
import logging | import logging | ||||
import socket | import socket | ||||
import struct | import struct | ||||
import sys | import sys | ||||
import time | |||||
from threading import RLock, Thread | from threading import RLock, Thread | ||||
from test_framework.messages import * | from test_framework.messages import * | ||||
logger = logging.getLogger("TestFramework.mininode") | logger = logging.getLogger("TestFramework.mininode") | ||||
MESSAGEMAP = { | MESSAGEMAP = { | ||||
b"addr": msg_addr, | b"addr": msg_addr, | ||||
▲ Show 20 Lines • Show All 198 Lines • ▼ Show 20 Lines | class NodeConn(asyncore.dispatcher): | ||||
def __init__(self, dstaddr, dstport, callback, net="regtest", services=NODE_NETWORK, send_version=True): | def __init__(self, dstaddr, dstport, callback, net="regtest", services=NODE_NETWORK, send_version=True): | ||||
asyncore.dispatcher.__init__(self, map=mininode_socket_map) | asyncore.dispatcher.__init__(self, map=mininode_socket_map) | ||||
self.dstaddr = dstaddr | self.dstaddr = dstaddr | ||||
self.dstport = dstport | self.dstport = dstport | ||||
self.create_socket(socket.AF_INET, socket.SOCK_STREAM) | self.create_socket(socket.AF_INET, socket.SOCK_STREAM) | ||||
self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) | self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) | ||||
self.sendbuf = b"" | self.sendbuf = b"" | ||||
self.recvbuf = b"" | self.recvbuf = b"" | ||||
self.last_sent = 0 | |||||
self.state = "connecting" | self.state = "connecting" | ||||
self.network = net | self.network = net | ||||
self.cb = callback | self.cb = callback | ||||
self.disconnect = False | self.disconnect = False | ||||
self.nServices = 0 | self.nServices = 0 | ||||
if send_version: | if send_version: | ||||
# stuff version msg into sendbuf | # stuff version msg into sendbuf | ||||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | def got_data(self): | ||||
m = MESSAGEMAP[command]() | m = MESSAGEMAP[command]() | ||||
m.deserialize(f) | m.deserialize(f) | ||||
return m | return m | ||||
except Exception as e: | except Exception as e: | ||||
logger.exception('Error reading message:', repr(e)) | logger.exception('Error reading message:', repr(e)) | ||||
raise | raise | ||||
def got_message(self, message): | def got_message(self, message): | ||||
if self.last_sent + 30 * 60 < time.time(): | |||||
self.send_message(MESSAGEMAP[b'ping']()) | |||||
self._log_message("receive", message) | self._log_message("receive", message) | ||||
self.cb.deliver(self, message) | self.cb.deliver(self, message) | ||||
# Socket write methods | # Socket write methods | ||||
def writable(self): | def writable(self): | ||||
with mininode_lock: | with mininode_lock: | ||||
pre_connection = self.state == "connecting" | pre_connection = self.state == "connecting" | ||||
Show All 35 Lines | def send_message(self, message, pushbuf=False): | ||||
if (len(self.sendbuf) == 0 and not pushbuf): | if (len(self.sendbuf) == 0 and not pushbuf): | ||||
try: | try: | ||||
sent = self.send(tmsg) | sent = self.send(tmsg) | ||||
self.sendbuf = tmsg[sent:] | self.sendbuf = tmsg[sent:] | ||||
except BlockingIOError: | except BlockingIOError: | ||||
self.sendbuf = tmsg | self.sendbuf = tmsg | ||||
else: | else: | ||||
self.sendbuf += tmsg | self.sendbuf += tmsg | ||||
self.last_sent = time.time() | |||||
# Class utility methods | # Class utility methods | ||||
def _log_message(self, direction, msg): | def _log_message(self, direction, msg): | ||||
if direction == "send": | if direction == "send": | ||||
log_message = "Send message to " | log_message = "Send message to " | ||||
elif direction == "receive": | elif direction == "receive": | ||||
log_message = "Received message from " | log_message = "Received message from " | ||||
Show All 35 Lines |