summaryrefslogtreecommitdiff
path: root/pysnmp/carrier
diff options
context:
space:
mode:
authorelie <elie>2012-06-25 23:26:30 +0000
committerelie <elie>2012-06-25 23:26:30 +0000
commit013d3b798db3d305c4c5ff41febb192d37e12ee2 (patch)
treed4d8ca70330111a5b3f3181ea6d4d6bb357d8520 /pysnmp/carrier
parent39735b07625783eb9c7ffaf5e4a8623d543ebb1b (diff)
downloadpysnmp-git-013d3b798db3d305c4c5ff41febb192d37e12ee2.tar.gz
socket transports may now deal not only with their native addresses,
but also with a special-purpose container object which can hold some additional transport-specific details while still acting as native address objects.
Diffstat (limited to 'pysnmp/carrier')
-rw-r--r--pysnmp/carrier/asyncore/dgram/base.py14
-rw-r--r--pysnmp/carrier/twisted/dgram/base.py13
2 files changed, 20 insertions, 7 deletions
diff --git a/pysnmp/carrier/asyncore/dgram/base.py b/pysnmp/carrier/asyncore/dgram/base.py
index dc280e57..9d200f88 100644
--- a/pysnmp/carrier/asyncore/dgram/base.py
+++ b/pysnmp/carrier/asyncore/dgram/base.py
@@ -1,6 +1,7 @@
-"""Implements asyncore-based generic DGRAM transport"""
+# Implements asyncore-based generic DGRAM transport
import socket, errno, sys
from pysnmp.carrier.asynsock.base import AbstractSocketTransport
+from pysnmp.carrier.address import TransportAddressPair
from pysnmp.carrier import error
from pysnmp import debug
@@ -39,7 +40,6 @@ class DgramSocketTransport(AbstractSocketTransport):
self.socket.bind(iface)
except socket.error:
raise error.CarrierError('bind() failed: %s' % (sys.exc_info()[1],))
- self._iface = iface
return self
def sendMessage(self, outgoingMessage, transportAddress):
@@ -52,7 +52,9 @@ class DgramSocketTransport(AbstractSocketTransport):
def writable(self): return self.__outQueue
def handle_write(self):
outgoingMessage, transportAddress = self.__outQueue.pop()
- debug.logger & debug.flagIO and debug.logger('handle_write: transportAddress %r outgoingMessage %r' % (transportAddress, outgoingMessage))
+ if isinstance(transportAddress, TransportAddressPair):
+ transportAddress = transportAddress.getRemoteAddr()
+ debug.logger & debug.flagIO and debug.logger('handle_write: transportAddress %r -> %r outgoingMessage %r' % (self.socket.getsockname(), transportAddress, outgoingMessage))
try:
self.socket.sendto(outgoingMessage, transportAddress)
except socket.error:
@@ -65,7 +67,11 @@ class DgramSocketTransport(AbstractSocketTransport):
def handle_read(self):
try:
incomingMessage, transportAddress = self.socket.recvfrom(65535)
- debug.logger & debug.flagIO and debug.logger('handle_read: transportAddress %r incomingMessage %r' % (transportAddress, incomingMessage))
+ debug.logger & debug.flagIO and debug.logger('handle_read: transportAddress %r -> %r incomingMessage %r' % (transportAddress, self.socket.getsockname(), incomingMessage))
+ transportAddress = TransportAddressPair(
+ self.socket.getsockname(),
+ transportAddress
+ )
if not incomingMessage:
self.handle_close()
return
diff --git a/pysnmp/carrier/twisted/dgram/base.py b/pysnmp/carrier/twisted/dgram/base.py
index 6a5a9b7e..5d512088 100644
--- a/pysnmp/carrier/twisted/dgram/base.py
+++ b/pysnmp/carrier/twisted/dgram/base.py
@@ -1,8 +1,9 @@
-"""Implements twisted-based generic DGRAM transport"""
+# Implements twisted-based generic DGRAM transport
import sys
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
from pysnmp.carrier.twisted.base import AbstractTwistedTransport
+from pysnmp.carrier.address import TransportAddressPair
from pysnmp.carrier import error
from pysnmp import debug
@@ -11,18 +12,22 @@ class DgramTwistedTransport(DatagramProtocol, AbstractTwistedTransport):
# Twisted Datagram API
- def datagramReceived(self, datagram, address):
+ def datagramReceived(self, datagram, transportAddress):
if self._cbFun is None:
raise error.CarrierError('Unable to call cbFun')
else:
+ # XXX fetch local endpoint from Twisted
+ transportAddress = TransportAddressPair(None, transportAddress)
# Callback fun is called through callLater() in attempt
# to make Twisted timed calls work under high load.
- reactor.callLater(0, self._cbFun, self, address, datagram)
+ reactor.callLater(0, self._cbFun, self, transportAddress, datagram)
def startProtocol(self):
debug.logger & debug.flagIO and debug.logger('startProtocol: invoked')
while self._writeQ:
outgoingMessage, transportAddress = self._writeQ.pop(0)
+ if isinstance(transportAddress, TransportAddressPair):
+ transportAddress = transportAddress.getRemoteAddr()
debug.logger & debug.flagIO and debug.logger('startProtocol: transportAddress %r outgoingMessage %r' % (transportAddress, outgoingMessage))
try:
self.transport.write(outgoingMessage, transportAddress)
@@ -38,6 +43,8 @@ class DgramTwistedTransport(DatagramProtocol, AbstractTwistedTransport):
if self.transport is None:
self._writeQ.append((outgoingMessage, transportAddress))
else:
+ if isinstance(transportAddress, TransportAddressPair):
+ transportAddress = transportAddress.getRemoteAddr()
try:
self.transport.write(outgoingMessage, transportAddress)
except Exception: