def _get_services(self): if not self.services or self.last_got_services + EXPIRE_CACHE < clock( ): self.services = [] try: f = win32com.client.Dispatch("UPnP.UPnPDeviceFinder") for t in ("urn:schemas-upnp-org:service:WANIPConnection:1", "urn:schemas-upnp-org:service:WANPPPConnection:1"): try: conns = f.FindByType(t, 0) for c in xrange(len(conns)): try: svcs = conns[c].Services for s in xrange(len(svcs)): try: self.services.append(svcs[s]) except: if DEBUG: print_exc() except: if DEBUG: print_exc() except: if DEBUG: print_exc() except: if DEBUG: print_exc() self.last_got_services = clock() return self.services
def _get_services(self): if not self.services or self.last_got_services + EXPIRE_CACHE < clock(): self.services = [] try: f=win32com.client.Dispatch("UPnP.UPnPDeviceFinder") for t in ( "urn:schemas-upnp-org:service:WANIPConnection:1", "urn:schemas-upnp-org:service:WANPPPConnection:1" ): try: conns = f.FindByType(t, 0) for c in xrange(len(conns)): try: svcs = conns[c].Services for s in xrange(len(svcs)): try: self.services.append(svcs[s]) except: if DEBUG: print_exc() except: if DEBUG: print_exc() except: if DEBUG: print_exc() except: if DEBUG: print_exc() self.last_got_services = clock() return self.services
def _get_map(self): if self.last_got_map + EXPIRE_CACHE < clock(): try: dispatcher = win32com.client.Dispatch("HNetCfg.NATUPnP") self.map = dispatcher.StaticPortMappingCollection self.last_got_map = clock() except: if DEBUG: print_exc() self.map = None return self.map
def __init__(self, socket_handler, sock, handler, ip=None): self.socket_handler = socket_handler self.socket = sock self.handler = handler self.buffer = [] self.last_hit = clock() self.fileno = sock.fileno() self.connected = False self.skipped = 0 # self.check = StreamCheck() self.myip = None self.myport = -1 self.ip = None self.port = -1 try: myname = self.socket.getsockname() self.myip = myname[0] self.myport = myname[1] peername = self.socket.getpeername() self.ip = peername[0] self.port = peername[1] except: # print_exc() if ip is None: self.ip = 'unknown' else: self.ip = ip
def scan_for_timeouts(self): t = clock() - self.timeout tokill = [] for s in self.single_sockets.values(): # Only SingleSockets can be closed because of timeouts if isinstance(s, SingleSocket) and s.last_hit < t: tokill.append(s) for k in tokill: if k.socket is not None: if DEBUG: print >> sys.stderr, "SocketHandler: scan_timeout closing connection", k.get_ip() self._close_socket(k)
def get_ip(self): if self.last_got_ip + EXPIRE_CACHE < clock(): if self.local_ip is None: local_ips = IP_List() local_ips.set_intranet_addresses() try: for info in socket.getaddrinfo(socket.gethostname(), 0, socket.AF_INET): # exception if socket library isn't recent self.local_ip = info[4][0] if local_ips.includes(self.local_ip): self.last_got_ip = clock() if DEBUG: print >>sys.stderr,'upnpX: Local IP found: '+self.local_ip break else: raise ValueError('upnpX: couldn\'t find intranet IP') except: self.local_ip = None if DEBUG: print >>sys.stderr,'upnpX: Error finding local IP' print_exc() return self.local_ip
def scan_for_timeouts(self): t = clock() - self.timeout tokill = [] for s in self.single_sockets.values(): # Only SingleSockets can be closed because of timeouts if isinstance(s, SingleSocket) and s.last_hit < t: tokill.append(s) for k in tokill: if k.socket is not None: if DEBUG: print >> sys.stderr, "SocketHandler: scan_timeout closing connection", k.get_ip( ) self._close_socket(k)
def get_ip(self): if self.last_got_ip + EXPIRE_CACHE < clock(): if self.local_ip is None: local_ips = IP_List() local_ips.set_intranet_addresses() try: for info in socket.getaddrinfo(socket.gethostname(), 0, socket.AF_INET): # exception if socket library isn't recent self.local_ip = info[4][0] if local_ips.includes(self.local_ip): self.last_got_ip = clock() if DEBUG: print >> sys.stderr, 'upnpX: Local IP found: ' + self.local_ip break else: raise ValueError('upnpX: couldn\'t find intranet IP') except: self.local_ip = None if DEBUG: print >> sys.stderr, 'upnpX: Error finding local IP' print_exc() return self.local_ip
def handle_events(self, events): for sock, event in events: # print >>sys.stderr,"SocketHandler: event on sock#",sock s = self.servers.get(sock) # socket.socket if s: if event & (POLLHUP | POLLERR) != 0: if DEBUG: print >> sys.stderr, "SocketHandler: Got event, close server socket" self.poll.unregister(s) del self.servers[sock] else: try: newsock, addr = s.accept() if DEBUG: print >> sys.stderr, "SocketHandler: Got connection from", newsock.getpeername() if not self.btengine_said_reachable: try: from Tribler.Core.NATFirewall.DialbackMsgHandler import DialbackMsgHandler dmh = DialbackMsgHandler.getInstance() dmh.network_btengine_reachable_callback() except ImportError: if DEBUG: print_exc() pass self.btengine_said_reachable = True # Only use the new socket if we can spare the # connections. Otherwise we will silently drop # the connection. if len(self.single_sockets) < self.max_connects: newsock.setblocking(0) nss = SingleSocket(self, newsock, self.handler) # create socket for incoming peers and tracker self.single_sockets[newsock.fileno()] = nss self.poll.register(newsock, POLLIN) self.handler.external_connection_made(nss) else: print >> sys.stderr, "SocketHandler: too many connects" newsock.close() except socket.error as e: if DEBUG: print >> sys.stderr, "SocketHandler: SocketError while accepting new connection", str(e) self._sleep() continue s = self.udp_sockets.get(sock) if s: packets = [] try: try: while True: (data, addr) = s.socket.recvfrom(65535) if not data: if DEBUG: print >> sys.stderr, "SocketHandler: UDP no-data", addr break else: if DEBUG: print >> sys.stderr, "SocketHandler: Got UDP data", addr, "len", len(data) packets.append((addr, data)) except socket.error as e: if DEBUG: print >> sys.stderr, "SocketHandler: UDP Socket error", str(e) finally: s.handler.data_came_in(packets) continue s = self.single_sockets.get(sock) if s: if (event & (POLLHUP | POLLERR)): if DEBUG: print >> sys.stderr, "SocketHandler: Got event, connect socket got error", sock print >> sys.stderr, "SocketHandler: Got event, connect socket got error", s.ip, s.port self._close_socket(s) continue if (event & POLLIN): try: s.last_hit = clock() data = s.socket.recv(100000) if not data: if DEBUG: print >> sys.stderr, "SocketHandler: no-data closing connection", s.get_ip(), s.get_port() self._close_socket(s) else: # if DEBUG: # print >> sys.stderr,"SocketHandler: Got data",s.get_ip(),s.get_port(),"len",len(data) # btlaunchmany: NewSocketHandler, btdownloadheadless: Encrypter.Connection s.handler.data_came_in(s, data) except socket.error as e: if DEBUG: print >> sys.stderr, "SocketHandler: Socket error", str(e) code, msg = e if code != SOCKET_BLOCK_ERRORCODE: if DEBUG: print >> sys.stderr, "SocketHandler: closing connection because not WOULDBLOCK", s.get_ip(), "error", code self._close_socket(s) continue if (event & POLLOUT) and s.socket and not s.is_flushed(): s.connected = True s.try_write() if s.is_flushed(): s.handler.connection_flushed(s) else: # Arno, 2012-08-1: Extra protection. print >>sys.stderr, "SocketHandler: got event on unregistered sock", sock try: self.poll.unregister(sock) except: pass
def _add_task(self, func, delay, id=None): if delay < 0: delay = 0 insort(self.funcs, (clock() + delay, func, id))
def listen_forever(self, handler): if DEBUG: print >> sys.stderr, "rawserver: listen forever()" # handler=btlanuchmany: MultiHandler, btdownloadheadless: Encoder self.thread_ident = get_ident() self.sockethandler.set_handler(handler) try: while not self.doneflag.isSet(): try: self.pop_external() self._kill_tasks() if self.funcs: period = self.funcs[0][0] + 0.001 - clock() else: period = 2**30 if period < 0: period = 0 #if DEBUG: # print >>sys.stderr,"rawserver: do_poll",period events = self.sockethandler.do_poll(period) if self.doneflag.isSet(): if DEBUG: print >> sys.stderr, "rawserver: stopping because done flag set" return #print >>sys.stderr,"RawServer: funcs is",`self.funcs` while self.funcs and self.funcs[0][0] <= clock( ) and not self.doneflag.isSet(): garbage1, func, id = self.funcs.pop(0) if id in self.tasks_to_kill: pass try: # print func.func_name if DEBUG: if func.func_name != "_bgalloc": print >> sys.stderr, "RawServer:f", func.func_name #st = time.time() func() #et = time.time() #diff = et - st #print >>sys.stderr,func,"took %.5f" % (diff) except (SystemError, MemoryError), e: self.failfunc(e) return except KeyboardInterrupt, e: # self.exception(e) return except error: if DEBUG: print >> sys.stderr, "rawserver: func: ERROR exception" print_exc() pass except Exception, e: # # boudewijn: someone made a big mistake, # # the code will not function as expected. # # notify someone for *uck sake! instead # # of silently hiding the problem and # # continuing... # raise if DEBUG: print >> sys.stderr, "rawserver: func: any exception" print_exc() if self.noisy: self.exception(e)
def handle_events(self, events): for sock, event in events: # print >>sys.stderr,"SocketHandler: event on sock#",sock s = self.servers.get(sock) # socket.socket if s: if event & (POLLHUP | POLLERR) != 0: if DEBUG: print >> sys.stderr, "SocketHandler: Got event, close server socket" self.poll.unregister(s) del self.servers[sock] else: try: newsock, addr = s.accept() if DEBUG: print >> sys.stderr, "SocketHandler: Got connection from", newsock.getpeername( ) if not self.btengine_said_reachable: try: from Tribler.Core.NATFirewall.DialbackMsgHandler import DialbackMsgHandler dmh = DialbackMsgHandler.getInstance() dmh.network_btengine_reachable_callback() except ImportError: if DEBUG: print_exc() pass self.btengine_said_reachable = True # Only use the new socket if we can spare the # connections. Otherwise we will silently drop # the connection. if len(self.single_sockets) < self.max_connects: newsock.setblocking(0) nss = SingleSocket( self, newsock, self.handler ) # create socket for incoming peers and tracker self.single_sockets[newsock.fileno()] = nss self.poll.register(newsock, POLLIN) self.handler.external_connection_made(nss) else: print >> sys.stderr, "SocketHandler: too many connects" newsock.close() except socket.error as e: if DEBUG: print >> sys.stderr, "SocketHandler: SocketError while accepting new connection", str( e) self._sleep() continue s = self.udp_sockets.get(sock) if s: packets = [] try: try: while True: (data, addr) = s.socket.recvfrom(65535) if not data: if DEBUG: print >> sys.stderr, "SocketHandler: UDP no-data", addr break else: if DEBUG: print >> sys.stderr, "SocketHandler: Got UDP data", addr, "len", len( data) packets.append((addr, data)) except socket.error as e: if DEBUG: print >> sys.stderr, "SocketHandler: UDP Socket error", str( e) finally: s.handler.data_came_in(packets) continue s = self.single_sockets.get(sock) if s: if (event & (POLLHUP | POLLERR)): if DEBUG: print >> sys.stderr, "SocketHandler: Got event, connect socket got error", sock print >> sys.stderr, "SocketHandler: Got event, connect socket got error", s.ip, s.port self._close_socket(s) continue if (event & POLLIN): try: s.last_hit = clock() data = s.socket.recv(100000) if not data: if DEBUG: print >> sys.stderr, "SocketHandler: no-data closing connection", s.get_ip( ), s.get_port() self._close_socket(s) else: # if DEBUG: # print >> sys.stderr,"SocketHandler: Got data",s.get_ip(),s.get_port(),"len",len(data) # btlaunchmany: NewSocketHandler, btdownloadheadless: Encrypter.Connection s.handler.data_came_in(s, data) except socket.error as e: if DEBUG: print >> sys.stderr, "SocketHandler: Socket error", str( e) code, msg = e if code != SOCKET_BLOCK_ERRORCODE: if DEBUG: print >> sys.stderr, "SocketHandler: closing connection because not WOULDBLOCK", s.get_ip( ), "error", code self._close_socket(s) continue if (event & POLLOUT) and s.socket and not s.is_flushed(): s.connected = True s.try_write() if s.is_flushed(): s.handler.connection_flushed(s) else: # Arno, 2012-08-1: Extra protection. print >> sys.stderr, "SocketHandler: got event on unregistered sock", sock try: self.poll.unregister(sock) except: pass
def listen_forever(self, handler): if DEBUG: print >>sys.stderr, "rawserver: listen forever()" # handler=btlanuchmany: MultiHandler, btdownloadheadless: Encoder self.thread_ident = get_ident() self.sockethandler.set_handler(handler) try: while not self.doneflag.isSet(): try: self.pop_external() self._kill_tasks() if self.funcs: period = self.funcs[0][0] + 0.001 - clock() else: period = 2 ** 30 if period < 0: period = 0 # if DEBUG: # print >>sys.stderr,"rawserver: do_poll",period events = self.sockethandler.do_poll(period) if self.doneflag.isSet(): if DEBUG: print >> sys.stderr, "rawserver: stopping because done flag set" return # print >>sys.stderr,"RawServer: funcs is",`self.funcs` while self.funcs and self.funcs[0][0] <= clock() and not self.doneflag.isSet(): garbage1, func, id = self.funcs.pop(0) if id in self.tasks_to_kill: pass try: # print func.func_name if DEBUG: if func.func_name != "_bgalloc": print >> sys.stderr, "RawServer:f", func.func_name # st = time.time() func() # et = time.time() # diff = et - st # print >>sys.stderr,func,"took %.5f" % (diff) except (SystemError, MemoryError) as e: self.failfunc(e) return except KeyboardInterrupt as e: # self.exception(e) return except error: if DEBUG: print >> sys.stderr, "rawserver: func: ERROR exception" print_exc() pass except Exception as e: # boudewijn: someone made a big mistake, # the code will not function as expected. # notify someone for *uck sake! instead # of silently hiding the problem and # continuing... # raise if DEBUG: print >> sys.stderr, "rawserver: func: any exception" print_exc() if self.noisy: self.exception(e) self.sockethandler.close_dead() self.sockethandler.handle_events(events) except (SystemError, MemoryError) as e: if DEBUG: print >> sys.stderr, "rawserver: SYS/MEM exception", e self.failfunc(e) return except error: if DEBUG: print >> sys.stderr, "rawserver: ERROR exception" print_exc() except KeyboardInterrupt as e: self.failfunc(e) return except Exception as e: # boudewijn: someone made a big mistake, the code # will not function as expected. notify someone # for *uck sake! instead of silently hiding the # problem and continuing... # raise if DEBUG: print >> sys.stderr, "rawserver: other exception" print_exc() self.exception(e) # Arno: Don't stop till we drop # if self.exccount > 10: # print >> sys.stderr,"rawserver: stopping because exccount > 10" # return finally: # self.sockethandler.shutdown() self.finished.set()