summaryrefslogtreecommitdiffstats
path: root/Code/Server-Code/ServerClass.py
blob: 93c2f8ee9997a39f55b6cb37315def370bf5b45e (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import socket
import sys
import os
import string
import signal

class TimeoutException(Exception):
        pass

class ServerHandler:
	
	def __init__(self,p):
		self.port = p 
		self.host = None #symbolic name meaning all available interfaces
		self.s = None
		self.connected = 0
		self.address = "127.0.0.1" #address of the main controller
		self.onceConnected = 0
		self.error = 'No error'

		self.debugMode = 0

	def openSocket(self):
		self.error = 'No error'
		for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    			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
				self.error = str(msg)
        			continue

    			try:
        			self.s.bind(sa)
        			self.s.listen(1)
    			except socket.error, msg:
        			self.s.close()
        			self.s = None
				self.connected = 0
				self.error = str(msg)
        			continue
    			break

		if self.s is None:
			self.connected = 0
			return 0
    		else:	#accept the connection
			self.connection, self.address = self.s.accept()
			self.connected = 1
			self.onceConnected = 1
			return 1

	def connectedTo(self):
		return self.address

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

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

			try:

				old_handler = signal.signal(signal.SIGALRM, timeout_handler)
	                        signal.alarm(timeout) #start the timeout alarm, for timeout seconds

    				data = self.connection.recv(1024)

				 #stop the timeout function      
                                signal.signal(signal.SIGALRM, old_handler)
                                signal.alarm(0)

				if not data:
					self.connected = 0
					return 'NO DATA'
				else:
					return data

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

			except Exception, e:
				#stop the timeout timer
				signal.signal(signal.SIGALRM, old_handler)
                                signal.alarm(0)

				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 sendData(self, data):
		if self.connected == 1:
			try:
    				self.connection.send(data)
				return 1

			except Exception, e:
				if self.debugMode == 1:
					import traceback
					print traceback.format_exc()
					print e
				self.connecected = 0
				return 2
		else:
			return 0
		
	def closeConnection(self):
		if self.onceConnected == 1:
			try:
				self.connected = 0
				SHUT_RDWR = 2
				self.connection.shutdown(SHUT_RDWR)
				self.connection.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

	def killPort(self):
		killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read()
		killResult = killResult.replace('\n','')
		print killResult
		if killResult!='':
			print killResult
			killPort = os.popen("kill -9 " + killResult).read()
			return 1
		return 0