Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Util/Network.py
diff options
context:
space:
mode:
authoramartin <olpc@xo-00-CE-12.localdomain>2007-06-25 21:51:33 (GMT)
committer amartin <olpc@xo-00-CE-12.localdomain>2007-06-25 21:51:33 (GMT)
commitccb46f528e1e6719d93f136c000d2f6927e0c724 (patch)
tree4e776ada3b268349432fbab4f96a1f935d367c8d /Util/Network.py
parent28185285179f3e3579514e1122d80fa5288f8927 (diff)
network
Diffstat (limited to 'Util/Network.py')
-rw-r--r--Util/Network.py76
1 files changed, 75 insertions, 1 deletions
diff --git a/Util/Network.py b/Util/Network.py
index 85e8e5a..80f6d7c 100644
--- a/Util/Network.py
+++ b/Util/Network.py
@@ -24,12 +24,15 @@ import Config
PORT = 24420
LISTENER_PORT = PORT-1
+WAIT_PORT = PORT-2
+
BACKLOG = 5 # allow a backlog of N new connections
MAX_SIZE = 1024 # max message size to receive in one go
MD_OFFLINE = 0
MD_HOST = 1
MD_PEER = 2
+MD_WAIT = 3
# enumerate message types
# format: ("NAME", <message size>)
@@ -115,6 +118,8 @@ class Network:
def __init__( self, mode = MD_OFFLINE, hostaddress = None ):
# check for forced networking
+ print "------------------------------------------------------------"
+ print os.getcwd()
if os.path.isfile("FORCE_HOST"):
mode = MD_HOST
elif os.path.isfile("FORCE_PEER"):
@@ -195,6 +200,14 @@ class Network:
self.connection.pop(self.socket)
self.socket = None
self.hostAddress = None
+ self.inputSockets = [ self.listenerSocket ]
+
+ elif self.mode == MD_WAIT:
+ if Config.DEBUG > 1: print "Network:: wait - cleaning up old connections"
+ self.socket.close()
+ self.connection.pop(self.socket)
+ self.socket = None
+ self.inputSockets = [ self.listenerSocket ]
# initialize new mode
@@ -251,12 +264,64 @@ class Network:
self.listenerSocket.sendto( "EXIT", ("localhost", LISTENER_PORT) )
self.listener = None
+ elif self.mode == MD_WAIT:
+ if Config.DEBUG > 1: print "Network:: initializing network, wait mode"
+ try:
+ self.socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
+ address = ("",PORT)
+ self.connection[self.socket] = Connection( self.socket, address )
+ self.socket.bind(address)
+ self.socket.listen(BACKLOG)
+ self.inputSockets.append(self.socket)
+ if self.listener:
+ self.listener.updateSockets( self.inputSockets, self.outputSockets, self.exceptSockets )
+ self.listenerSocket.sendto( "REFRESH", ("localhost", LISTENER_PORT) )
+ else:
+ self.listener = Listener( self, self.listenerSocket, self.inputSockets, self.outputSockets, self.exceptSockets )
+ self.listener.start()
+ except socket.error, (value, message):
+ if self.socket:
+ self.socket.close()
+ self.connection.pop(self.socket)
+ print "Network:: FAILED to open socket: " + message
+ self.mode = MD_OFFLINE
+ if self.listener:
+ self.listenerSocket.sendto( "EXIT", ("localhost", LISTENER_PORT) )
+ self.listener = None
+
else:
if Config.DEBUG > 1: print "Network:: offline"
if self.listener:
self.listenerSocket.sendto( "EXIT", ("localhost", LISTENER_PORT) )
self.listener = None
+ def introducePeer( self, ip ):
+ if Config.DEBUG > 1: print "Network:: introducing self to peer " + ip
+ try:
+ poke = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
+ poke.setblocking(0)
+ except socket.error, (value, message):
+ print "Network::introducePeer:: FAILED to open socket: " + message
+ return
+ if poke.connect_ex( (ip, WAIT_PORT) ): # failed to connect
+ gobject.timeout_add( 500, self._pokePeer, poke, ip, 0 )
+ else: # connected
+ if Config.DEBUG > 1: print "Netwtork:: introduction succeeded"
+ poke.close()
+
+ def _pokePeer( self, poke, ip, retry ):
+ if poke.connect_ex( (ip, WAIT_PORT) ): # failed to connect
+ if retry > 120: # give up
+ print "Network::introducePeer:: peer failed to respond after 60 seconds, giving up!"
+ else:
+ gobject.timeout_add( 500, self._pokePeer, poke, ip, retry+1 )
+ else: # connected
+ if Config.DEBUG > 1: print "Netwtork:: introduction succeeded"
+ poke.close()
+
+ return False
+
+
def addPeer( self, peer, address ):
if Config.DEBUG > 1: print "Network:: adding peer: %s" % address[0]
self.connection[peer] = Connection( peer, address )
@@ -430,7 +495,7 @@ class Network:
except socket.error, (value, message):
print "Network:: error reading data: " + message
- else: # MD_PEER
+ elif self.mode == MD_PEER:
for s in inputReady:
try:
@@ -443,6 +508,15 @@ class Network:
except socket.error, (value, message):
print "Network:: error reading data: " + message
+ else: # MD_WAIT
+
+ for s in inputReady:
+ try:
+ peer, address = self.socket.accept()
+ self.setMode( MD_PEER, address )
+ except socket.error, (value, message):
+ print "Network:: error accepting connection: " + message
+
def processStream( self, sock, newData = "" ):
con = self.connection[sock]