summaryrefslogblamecommitdiffstats
path: root/Code/Server-Code/ClientClass.py
blob: 46c3b00dd1ae786095f8f1aa3dd955acfc79c5d1 (plain) (tree)


























































































































                                                                                                                                                 
import socket
import sys
import os
import string 
import signal 

class TimeoutException(Exception):
	pass

class Connection:
	def __init__(self, h, p):
		self.host = h
		self.port = p
		self.s = None
		self.connected = 0

		self.debugMode = 0

	def connect(self):
		self.s = None
		
		for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM):
			af, socktype, proto, canonname, sa = res
		    	try:
		        	self.s = socket.socket(af, socktype, proto)
				self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets
		    	except socket.error, msg:
		        	self.s = None
				self.connected = 0
		        	continue
		    	try:
		        	self.s.connect(sa)
		    	except socket.error, msg:
		        	self.s.close()
				self.connected = 0
		        	self.s = None
		        	continue
		    	break
		if self.s is None:
			self.connected = 0
			return 0 #couldn't connect to the server
		else: 
			self.connected = 1
			return 1 #successfully connected to the server

	def sendData(self, data):
		if self.connected == 1:
			try:
				self.s.send(data)
				return 1
			except Exception, e:
				if self.debugMode == 1:
					import traceback
					print traceback.format_exc()
					print e
				self.connected = 0
				return 2
					
		else:
			return 0

	def receiveData(self, timeout):
		if self.connected == 1:

			def timeout_handler(signum, frame):
				raise TimeoutException()

			old_handler = signal.signal(signal.SIGALRM, timeout_handler)
			signal.alarm(timeout) #start the timeout alarm, for timeout seconds
			try:
				data = self.s.recv(1024)
				
				#stop the timeout function	
				signal.signal(signal.SIGALRM, old_handler) 
				signal.alarm(0)			

                        	return data


			except TimeoutException:
				#timeout happened
                        	signal.signal(signal.SIGALRM, old_handler)
                        	signal.alarm(0)
                        	return 'TIMEOUT'

			except Exception, e:

				signal.signal(signal.SIGALRM, old_handler)
                                signal.alarm(0) 

				error = str(e)
				if self.debugMode == 1:
					import traceback
					print traceback.format_exc()
					print e
				self.connected = 0
				if error[0:11] == '[Errno 104]':
					return 3 #the other side reset the connection,[Errno 104] Connection reset by peer

				return 2
		else:
			return 0 

	def closeConnection(self):
		if self.connected == 1:
			try:
				self.connected = 0
				SHUT_RDWR = 2
				self.s.shutdown(SHUT_RDWR)
				self.s.close()
				return 1
			except Exception, e:
				self.connected = 0
				error = str(e)
				if self.debugMode == 1:
					import traceback
					print traceback.format_exc()
					print e
				if error[0:11] == '[Errno 107]':
					return 3 #the other side closed the connection before us, [Errno 107] Transport endpoint is not connected
				return 2
		else:
			return 0