summaryrefslogtreecommitdiffstats
path: root/Code/Server-Code/ClientClass.py
blob: 46c3b00dd1ae786095f8f1aa3dd955acfc79c5d1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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