def test_connectedReadImmediateError(self): """ If the socket connected, socket reads with an immediate connection refusal are ignored, and reading stops. The protocol's C{connectionRefused} method is called. """ # Add a fake error to the list of those that count as connection # refused: udp._sockErrReadRefuse.append(-6000) self.addCleanup(udp._sockErrReadRefuse.remove, -6000) protocol = KeepReads() refused = [] protocol.connectionRefused = lambda: refused.append(True) port = udp.Port(None, protocol) port.socket = StringUDPSocket( ["a", socket.error(-6000), "b", socket.error(EWOULDBLOCK)]) port.connect("127.0.0.1", 9999) # Read stops on error: port.doRead() self.assertEqual(protocol.reads, ["a"]) self.assertEqual(refused, [True]) # Read again: port.doRead() self.assertEqual(protocol.reads, ["a", "b"]) self.assertEqual(refused, [True])
def test_readImmediateError(self): """ If the socket is unconnected, socket reads with an immediate connection refusal are ignored, and reading stops. The protocol's C{connectionRefused} method is not called. """ # Add a fake error to the list of those that count as connection # refused: udp._sockErrReadRefuse.append(-6000) self.addCleanup(udp._sockErrReadRefuse.remove, -6000) protocol = KeepReads() # Fail if connectionRefused is called: protocol.connectionRefused = lambda: 1 / 0 port = udp.Port(None, protocol) # Try an immediate "connection refused" port.socket = StringUDPSocket( [b"a", socket.error(-6000), b"b", socket.error(EWOULDBLOCK)]) port.doRead() # Read stops on error: self.assertEqual(protocol.reads, [b"a"]) # Read again: port.doRead() self.assertEqual(protocol.reads, [b"a", b"b"])
def listenUDP(self, port, protocol, interface='', maxPacketSize=8192): """Connects a given L{DatagramProtocol} to the given numeric UDP port. @returns: object conforming to L{IListeningPort}. """ p = udp.Port(port, protocol, interface, maxPacketSize, self) p.startListening() return p
def test_readUnknownError(self): """ Socket reads with an unknown socket error are raised. """ protocol = KeepReads() port = udp.Port(None, protocol) # Some good data, followed by an unknown error port.socket = StringUDPSocket([b"good", socket.error(-1337)]) self.assertRaises(socket.error, port.doRead) self.assertEqual(protocol.reads, [b"good"])
def useUdpFileDescriptor(self, fd): s = socket.fromfd(fd, socket.AF_INET, socket.SOCK_DGRAM) os.close(fd) port = s.getsockname()[1] transport = udp.Port(port, self) s.setblocking(0) transport.socket = s transport.fileno = s.fileno transport.connected = 1 transport._realPortNumber = port self.transport = transport # hack around startListening not being called self.numPorts = 1 transport.startReading()
def start(): for n, (ip, oids) in enumerate(agents.iteritems()): print '%s) %s:%s' % (n, ip, port) p = udp.Port( port, agentprotocol.AgentProtocol( snmpVersion='v2c', agent=agent.Agent(dataStore=bisectoidstore.BisectOIDStore( OIDs=oids, ), ), community=None, # accept all communities ), ip, 8192, # maxPacketSize reactor) p.startListening() print 'are simulated.'
def test_NoWarningOnBroadcast(self): """ C{'<broadcast>'} is an alternative way to say C{'255.255.255.255'} ({socket.gethostbyname("<broadcast>")} returns C{'255.255.255.255'}), so because it becomes a valid IP address, no deprecation warning about passing hostnames to L{twisted.internet.udp.Port.write} needs to be emitted by C{write()} in this case. """ class fakeSocket: def sendto(self, foo, bar): pass p = udp.Port(0, Server()) p.socket = fakeSocket() p.write("test", ("<broadcast>", 1234)) warnings = self.flushWarnings([self.test_NoWarningOnBroadcast]) self.assertEqual(len(warnings), 0)
def startService(self): # use socket creation from twisted to use the same options as before if hasattr(self.protocol, 'datagramReceived'): tmp_port = udp.Port(None, None, interface=self.interface) else: tmp_port = tcp.Port(None, None, interface=self.interface) carbon_sock = tmp_port.createInternetSocket() if hasattr(socket, 'SO_REUSEPORT'): carbon_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) carbon_sock.bind((self.interface, self.port)) if hasattr(self.protocol, 'datagramReceived'): self._port = reactor.adoptDatagramPort( carbon_sock.fileno(), socket.AF_INET, self.protocol()) else: carbon_sock.listen(tmp_port.backlog) self._port = reactor.adoptStreamPort( carbon_sock.fileno(), socket.AF_INET, self.factory) carbon_sock.close()
def test_socketReadNormal(self): """ Socket reads with some good data followed by a socket error which can be ignored causes reading to stop, and no log messages to be logged. """ # Add a fake error to the list of ignorables: udp._sockErrReadIgnore.append(-7000) self.addCleanup(udp._sockErrReadIgnore.remove, -7000) protocol = KeepReads() port = udp.Port(None, protocol) # Normal result, no errors port.socket = StringUDPSocket( [b"result", b"123", socket.error(-7000), b"456", socket.error(-7000)]) port.doRead() # Read stops on error: self.assertEqual(protocol.reads, [b"result", b"123"]) port.doRead() self.assertEqual(protocol.reads, [b"result", b"123", b"456"])
def listenUDP(self, port, protocol, interface="", maxPacketSize=8196): p = udp.Port(port, protocol, interface, maxPacketSize, self) p.startListening() self._udp.append(p) return p
def listenUDP(self, port, factory, interface='', maxPacketSize=8192): """ Connects a given protocol factory to the given numeric TCP/IP port. """ from twisted.internet import udp self.addPort(udp.Port(port, factory, interface, maxPacketSize))