Example #1
0
	def __init__(self, host, port, keepalive=True, debug=True):
		if isinstance(port, str):
			port = int(port)
		self.host=host
		self.port=port
		self._socket=None
		self._socket_lock=threading.Lock()
		self.state=self.CLOSED
		self.outseq=0
		self.debug=debug
		self._connect()
		self._keepalive_thread = None
		if keepalive:
			self._keepalive_thread = SMPPKeepAlive(self)
			self._keepalive_thread.start()
Example #2
0
class SMPP:
	"""A Limited Synchronous SMPP API designed for ease of use"""
	CLOSED=0
	OPEN=1
	BOUND_TX=2
	BOUND_RX=3
	BOUND_TRX=4
	BIND_TX=BOUND_TX
	BIND_RX=BOUND_RX
	BIND_TRX=BOUND_TRX

	def __init__(self, host, port, keepalive=True, debug=True):
		if isinstance(port, str):
			port = int(port)
		self.host=host
		self.port=port
		self._socket=None
		self._socket_lock=threading.Lock()
		self.state=self.CLOSED
		self.outseq=0
		self.debug=debug
		self._connect()
		self._keepalive_thread = None
		if keepalive:
			self._keepalive_thread = SMPPKeepAlive(self)
			self._keepalive_thread.start()

	def _keepalive(self):
		ret = None
		if self.state >= self.BOUND_TX:
			if self.debug:
				print "Sending keepalive"
			ret = self.enquire_link()
		return ret

	def _takesocket(self):
		self._socket_lock.acquire()
		# We have the lock now
		return self._socket

	def _releasesocket(self):
		self._socket_lock.release()
		sleep(0.0001) # Yield to thread scheduler
		return None

	def _disconnect(self):
		if self.state >= self.BOUND_TX:
			self._unbind()
		self._socket.close()
		self.state=self.CLOSED

	def _connect(self):
		if not self.state == self.CLOSED:
			raise SMPPException("Attempting to connect out of turn!")

		self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
		self._socket.settimeout(30.0)
		try:
			self._socket.connect((self.host, self.port))
		except socket.error:
			raise
		state=self.OPEN

	def _send_raw(self, data):
		# Verify state is sane (socket open, and we're bound)
		sock = self._takesocket() # It'll be released by _sock_read
		if self.debug:
			cmd = unpack("!L", data[4:8])[0]
			print "Sending %s.." % (command_b2a[cmd])
		if self.debug:
			print ">> %s" % b2a_hex(data)
		try:
			sock.sendall(data)
		except Exception, e:
			if self.debug:
				print "Got error writing to socket, reconnecting"
			oldstate = self.state
			self.state = self.CLOSED
			self._connect()
			sock = self._releasesocket()
			self.rebind(oldstate)
			raise
		return sock