@@ -1614,7 +1614,7 @@ class NodeConn(asyncore.dispatcher):
1614
1614
"regtest" : b"\xfa \xbf \xb5 \xda " , # regtest
1615
1615
}
1616
1616
1617
- def __init__ (self , dstaddr , dstport , rpc , callback , net = "regtest" , services = NODE_NETWORK ):
1617
+ def __init__ (self , dstaddr , dstport , rpc , callback , net = "regtest" , services = NODE_NETWORK , send_version = True ):
1618
1618
asyncore .dispatcher .__init__ (self , map = mininode_socket_map )
1619
1619
self .log = logging .getLogger ("NodeConn(%s:%d)" % (dstaddr , dstport ))
1620
1620
self .dstaddr = dstaddr
@@ -1631,14 +1631,16 @@ def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", services=NODE
1631
1631
self .disconnect = False
1632
1632
self .nServices = 0
1633
1633
1634
- # stuff version msg into sendbuf
1635
- vt = msg_version ()
1636
- vt .nServices = services
1637
- vt .addrTo .ip = self .dstaddr
1638
- vt .addrTo .port = self .dstport
1639
- vt .addrFrom .ip = "0.0.0.0"
1640
- vt .addrFrom .port = 0
1641
- self .send_message (vt , True )
1634
+ if send_version :
1635
+ # stuff version msg into sendbuf
1636
+ vt = msg_version ()
1637
+ vt .nServices = services
1638
+ vt .addrTo .ip = self .dstaddr
1639
+ vt .addrTo .port = self .dstport
1640
+ vt .addrFrom .ip = "0.0.0.0"
1641
+ vt .addrFrom .port = 0
1642
+ self .send_message (vt , True )
1643
+
1642
1644
print ('MiniNode: Connecting to Bitcoin Node IP # ' + dstaddr + ':' \
1643
1645
+ str (dstport ))
1644
1646
@@ -1652,8 +1654,9 @@ def show_debug_msg(self, msg):
1652
1654
self .log .debug (msg )
1653
1655
1654
1656
def handle_connect (self ):
1655
- self .show_debug_msg ("MiniNode: Connected & Listening: \n " )
1656
- self .state = "connected"
1657
+ if self .state != "connected" :
1658
+ self .show_debug_msg ("MiniNode: Connected & Listening: \n " )
1659
+ self .state = "connected"
1657
1660
1658
1661
def handle_close (self ):
1659
1662
self .show_debug_msg ("MiniNode: Closing Connection to %s:%d... "
@@ -1681,11 +1684,20 @@ def readable(self):
1681
1684
1682
1685
def writable (self ):
1683
1686
with mininode_lock :
1687
+ pre_connection = self .state == "connecting"
1684
1688
length = len (self .sendbuf )
1685
- return (length > 0 )
1689
+ return (length > 0 or pre_connection )
1686
1690
1687
1691
def handle_write (self ):
1688
1692
with mininode_lock :
1693
+ # asyncore does not expose socket connection, only the first read/write
1694
+ # event, thus we must check connection manually here to know when we
1695
+ # actually connect
1696
+ if self .state == "connecting" :
1697
+ self .handle_connect ()
1698
+ if not self .writable ():
1699
+ return
1700
+
1689
1701
try :
1690
1702
sent = self .send (self .sendbuf )
1691
1703
except :
0 commit comments