Exemplo n.º 1
0
	def conn(self, addr, port):
		if self.isConnected:
			self.close()

		self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

		buf = struct.pack('ii', 0, 0)
		self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, buf)

		try:
			self.sock.connect( (addr, port) )

			self.fileno = self.sock.fileno()
			self.connectedAddr = addr
			self.connectedPort = port
			self.isConnected = True
			self.nowRequestPerConnection = 0
			self.countConnectionSuccess += 1
			self.data = ''
			if log.getLogLevel() >= 3:
				print "eh %3d: connected" % (self.fileno)
		except:
			self.isConnected = False
			self.countConnectionFail += 1
			if log.getLogLevel() >= 1:
				print "eh %3d: connection fail" % (self.fileno)
Exemplo n.º 2
0
	def send(self, data):
		try:
			self.sock.send(data)
		except:
			self.close()

		if log.getLogLevel() >= 3:
			print "eh %3d: send data" % (self.fileno)

		if log.getLogLevel() >= 5:
			print data
Exemplo n.º 3
0
	def proc(self):
		localTimeout = 0
		waitTime = 1

		while self.isConnected and self.isRun:
			handles = [self.sock.fileno()]
			try:
				reads, writes, in_erros = select.select(handles, [], [], waitTime)
			except:
				reads = []

			for sock in reads:
				#print "reactor: event on sock %d" % (sock.fileno())
				self.handle_input()

			if len(reads) == 0:
				localTimeout += 1
				if(localTimeout * waitTime >= 30): # timeout 값
					self.countSelectTimeout += 1
					if log.getLogLevel() >= 3:
						print "eh %3d: select timeout" % (self.fileno)
					self.closeRequest()
					break
			else:
				localTimeout = 0
Exemplo n.º 4
0
	def proc(self):
		localTimeout = 0
		waitTime = 1

		while self.isConnected and self.isRun:
			handles = [self.sock.fileno()]
			try:
				reads, writes, in_erros = select.select(handles, [], [], waitTime)
			except:
				reads = []

			for sock in reads:
				#print "reactor: event on sock %d" % (sock.fileno())
				self.handle_input()

			if len(reads) == 0:
				localTimeout += 1

				if(localTimeout * waitTime >= 60): # timeout 값
					self.countSelectTimeout += 1
					if log.getLogLevel() >= 3:
						print "eh %3d: select timeout" % (self.fileno)

					timeoutFile = file("timeout.log", "a+")
					timeoutString = "eh %3d: reqURL[%s] headerContentLength[%d] recvBodySize[%d]\n" % (self.fileno, self.URL, self.headerContentLength, self.recvBodySize)
					timeoutFile.write(timeoutString)
					timeoutFile.close()

					self.close()
					break
			else:
				localTimeout = 0
Exemplo n.º 5
0
	def sendRequest(self):
		self.recvPipelineNum = 0

		self.data = ''
		self.requestClock = time.time()
		self.requestCompleted = False
		self.headerContentLength = -1
		self.recvBodySize = -1

		for i in range(0, self.MaxPipelineNum):
			self.nowRequestPerConnection += 1
			self.makeMsg()
			self.send(self.msg)
			if log.getLogLevel() >= 2:
				print "eh %3d: request URL(%s)" % (self.fileno, self.URL)

			#print self.msg

		# 접속 종료 (1%확률)
		if closingProbability > 0:
			if random.randint(1, 100) <= closingProbability :
				time.sleep(random.randint(0, 100)/100.0)
				#print "phone close: MDN=%s sock=%d" % (self.MIN, self.fileno)
				self.close()
				self.activeClose += 1
Exemplo n.º 6
0
	def closeRequest(self):
		if log.getLogLevel() >= 3:
			print "eh %3d: reqeust close" % (self.fileno)

		if self.isConnected == False:
			print "eh %3d: already closed" % (self.fileno)

		self.sock.shutdown(socket.SHUT_WR)
Exemplo n.º 7
0
	def run(self):
		self.isRun = True

		if log.getLogLevel() >= 2:
			print "eh %3d: start......." % (self.fileno)

		while (self.MaxRequests <= 0 or self.MaxRequests > len(self.runTimeInfo)) and self.isRun:
			self.conn(self.addr, self.port)

			if self.isConnected :
				self.sendRequest()
				self.proc()
			else:
				try:
					time.sleep(0.01)
				except:
					pass

		if log.getLogLevel() >= 2:
			print "eh %3d stop........" % (self.fileno)
Exemplo n.º 8
0
	def close(self):
		if self.isConnected:
			if log.getLogLevel() >= 4:
				print "eh %3d: socket close" % (self.fileno)

			try:
				self.sock.shutdown(socket.SHUT_RDWR)
			except:
				pass

			self.sock.close()
			self.isConnected = False
			del self.sock
Exemplo n.º 9
0
	def sendRequest(self):
		if self.requestSleepTime > 0.0:
			try:
				time.sleep(self.requestSleepTime)
			except:
				pass

		self.recvPipelineNum = 0

		self.data = ''
		self.requestClock = time.time()
		self.requestCompleted = False
		self.headerContentLength = -1
		self.nowRequestPerConnection += 1
		self.recvBodySize = -1

		for i in range(0, self.MaxPipelineNum):
			self.makeMsg()
			self.send(self.msg)
			if log.getLogLevel() >= 2:
				print "eh %3d: request URL(%s)" % (self.fileno, self.URL)
Exemplo n.º 10
0
	def sendRequest(self):
		self.recvPipelineNum = 0

		self.data = ''
		self.requestClock = time.time()
		self.requestCompleted = False
		self.headerContentLength = -1
		self.recvBodySize = -1

		for i in range(0, self.MaxPipelineNum):
			self.nowRequestPerConnection += 1
			self.makeMsg()
			self.send(self.msg)
			if log.getLogLevel() >= 2:
				print "eh %3d: request URL(%s)" % (self.fileno, self.URL)

			#print self.msg

		# 접속 종료 (1%확률)
		if closingProbability > 0:
			if random.randint(1, 100) <= closingProbability :
				time.sleep(random.randint(0, 100)/100.0)
				self.close()
				self.activeClose += 1
Exemplo n.º 11
0
def startRequest(reactor, runTimeInfo, UrlList, targetClients, timeout):
	global SummaryList
	global RequestPerConnection
	global IsRun
	global MaxRequests
	global RequestSleepTime
	global PipelineNum

	IsRun = True
	
	Clients = []

	for i in range(0, targetClients):
		MIN = "0100000%04d" % (i+1)
		c = eh.eh(reactor, runTimeInfo, RequestPerConnection, UrlList, MaxRequests, HostIP, Port, RequestSleepTime, MIN, PipelineNum)
		c.start()
		Clients.append(c)

		if RequestSleepTime > 0.0:
			try:
				time.sleep(RequestSleepTime/targetClients)
			except:
				pass

		sys.stdout.write(".")
		sys.stdout.flush()

	print ""

	programTimeout = time.time() + timeout
	programStartTime = time.time()

	# event loop
	oldRequestNum = 0
	while IsRun:
		newRequestNum = len(runTimeInfo)
		diffRequestNum = newRequestNum - oldRequestNum
		oldRequestNum = newRequestNum

		if log.getLogLevel() == 0:
			d = time.localtime(time.time())
			dstr =  "%02d:%02d:%02d" % (d[3], d[4], d[5])
			if timeout > 0:
				leftTime = programTimeout - time.time()
				print dstr, "Clients: %d/%d, Request: %d(+%3d), ConFail: %d, Timeout: %d, Recv: %.1fM, LeftTime: %dsec" % \
					(getConnectionCount(Clients), len(Clients), newRequestNum, diffRequestNum, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients), getRecvDataSize(Clients)/1024.0/1024.0, leftTime)

			elif MaxRequests > 0:
				print dstr, "Clients: %d/%d, Request: %d(+%3d)/%d, ConFail: %d, Timeout: %d, Recv: %.1fM" % \
					(getConnectionCount(Clients), len(Clients), newRequestNum, diffRequestNum, MaxRequests, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients), getRecvDataSize(Clients)/1024.0/1024.0)

			else:
				print dstr, "Clients: %d/%d, Request: %d(+%3d), ConFail: %d, Timeout: %d, Recv: %.1fM" % \
					(getConnectionCount(Clients), len(Clients), newRequestNum, diffRequestNum, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients), getRecvDataSize(Clients)/1024.0/1024.0)

		# 종료 조건 확인
		if MaxRequests > 0 and len(runTimeInfo) >= MaxRequests:
			IsRun = False
			break

		if timeout > 0 and programTimeout < time.time():
			break

		try:
			time.sleep(1)
		except:
			pass

	for c in Clients:
		c.isRun = False

	programEndTime = time.time()
	programRunTime = programEndTime - programStartTime
	
	for c in Clients:
		c.join()
		c.close()
		del c


	

	strSummary = getSummary(runTimeInfo, programRunTime, getConnectionSuccessCount(Clients), targetClients, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients), getActiveClose(Clients))

	print "-----------------------------------------------------------------------"
	print strSummary

	#filename = "c%03d_sizeBasedTime.csv" % targetClients
	#saveSizeBasedTime(filename, runTimeInfo, strSummary)

	#filename = "c%03d_runTimeInfo.csv" % targetClients
	#saveRunTimeInfo(filename, runTimeInfo)

	stats = getSummaryStats(runTimeInfo, programRunTime, getConnectionSuccessCount(Clients), targetClients, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients), getActiveClose(Clients))

	return stats
Exemplo n.º 12
0
def parseParam():
	global HostIP
	global Port
	global TargetClients
	global RequestPerConnection
	global MaxRequests
	global MinClients
	global MaxClients
	global StepClients
	global IntervalTime
	global LastTime
	global RequestSleepTime
	global PipelineNum

	if len(sys.argv) < 3:
		print "usage: %s HostIP PortNumber [ClientNumber=%d or Min/Max/Step/IntervalTime/LastTime] [RequestPerConnection=%d] [PipelineNum=%d] [MaxRequests=%d] [RequestSleepTime=%.1f] [LogLevel=%d]" \
			% (sys.argv[0], TargetClients, RequestPerConnection, PipelineNum, MaxRequests, RequestSleepTime, log.getLogLevel())
		sys.exit()

	paramIndex = 1
	HostIP = sys.argv[paramIndex]

	paramIndex += 1
	Port = int(sys.argv[paramIndex])

	paramIndex += 1
	if len(sys.argv) > paramIndex:
		args = sys.argv[paramIndex].split("/")

		if len(args) == 5 :
			TargetClients = -1
			MinClients = int(args[0])
			MaxClients = int(args[1])
			StepClients = int(args[2])
			IntervalTime = int(args[3])
			LastTime = int(args[4])

		else:
			TargetClients = int(sys.argv[paramIndex])

	paramIndex += 1
	if len(sys.argv) > paramIndex:
		RequestPerConnection = int(sys.argv[paramIndex])

	paramIndex += 1
	if len(sys.argv) > paramIndex:
		PipelineNum = int(sys.argv[paramIndex])

	paramIndex += 1
	if len(sys.argv) > paramIndex:
		MaxRequests = int(sys.argv[paramIndex])

	paramIndex += 1
	if len(sys.argv) > paramIndex:
		RequestSleepTime = float(sys.argv[paramIndex])

	paramIndex += 1
	if len(sys.argv) > paramIndex:
		log.setLogLevel(int(sys.argv[paramIndex]))
Exemplo n.º 13
0
	def handle_input(self):
		try:
			if(self.headerContentLength < 0):
				one = self.sock.recv(1024)
				self.data += one
			else:
				one = self.sock.recv(self.headerContentLength - self.recvBodySize)
				self.recvBodySize += len(one)
		except:
			one = ""

		#print "recv body size : %d, self.headerContentLength  : %d" % (self.recvBodySize, self.headerContentLength)

		self.recvDataSize += len(one)

		# 디버깅 정보 표시
		if log.getLogLevel() >= 3:
			print "eh %3d: recv %10d (+%8d) bytes" % (self.fileno, len(self.data), len(one))


		# 디버깅 정보 표시
		if log.getLogLevel() >= 5:
			if len(one) > 0:
				print "%s" % (one)

		# 접속 종료
		if len(one) == 0:
			if log.getLogLevel() >= 3:
				print "eh %3d: closed by peer" % (self.fileno)
			self.close()

		else:
			# 요청 완료 여부 확인
			if self.headerContentLength < 0:
				self.headerContentLength = self.getHeaderContentLength()
	
				if self.headerContentLength > 0:
					self.recvBodySize = self.getRealContentLength()
	
				if log.getLogLevel() >= 4:
					print "eh %3d: Set headerContentLength = %d" % (self.fileno, self.headerContentLength)


			if(self.headerContentLength < self.recvBodySize):
				print "-.-;"	

			

			# 기다리는 데이터 사이즈 만큼 수신됐을 때
			if self.recvBodySize >= 0 and self.headerContentLength <= self.recvBodySize:
				self.requestCompleted = True
				endTime = time.time()
				elapsedTime = endTime - self.requestClock

				if log.getLogLevel() >= 1:
					print "eh %3d: request complete. elapsed time %f" % (self.fileno, elapsedTime)

				if self.headerContentLength < self.recvBodySize:
					print "self.headerContentLength[%d] < self.recvBodySize[%d]" % (self.headerContentLength, self.recvBodySize)

				info = [self.URL, elapsedTime, self.recvBodySize, self.requestClock, endTime]
				self.runTimeInfo.append(info)

				self.recvPipelineNum += 1

				if(self.recvPipelineNum >= self.MaxPipelineNum):
					if self.nowRequestPerConnection >= self.MaxRequestPerConnection:
						if self.isConnected:
							self.closeRequest()

					elif self.MaxRequests > 0 and self.MaxRequests <= len(self.runTimeInfo):
						if self.isConnected:
							self.closeRequest()

					else:
						self.sendRequest()
				else:
					self.data = ''
					self.requestCompleted = False
					self.headerContentLength = -1
					self.recvBodySize = -1
Exemplo n.º 14
0
def startRequest(reactor, runTimeInfo, UrlList, targetClients, timeout, intervalTime=0, stepNums=0):
	global SummaryList
	global RequestPerConnection
	global IsRun
	global MaxRequests
	global RequestSleepTime
	global PipelineNum
	global Clients
	
	IsRun = True
	
	startClients(reactor, runTimeInfo, UrlList, targetClients, timeout, intervalTime, stepNums)
	
	programTimeout = time.time() + timeout
	programStartTime = time.time()
	
	# event loop
	oldRequestNum = 0
	
	steptimeout = 0
	
	while IsRun:
		newRequestNum = len(runTimeInfo)
		diffRequestNum = newRequestNum - oldRequestNum
		oldRequestNum = newRequestNum

		if log.getLogLevel() == 0:
			#d = time.localtime(time.time())
			#dstr =  "%02d:%02d:%02d" % (d[3], d[4], d[5])
			dstr = str(datetime.datetime.now())
			
			if timeout > 0:
				leftTime = programTimeout - time.time()
				print dstr, "Clients: %d/%d, Request: %d(+%3d), ConFail: %d, Timeout: %d, Recv: %.1fM, LeftTime: %dsec" % \
					(getConnectionCount(Clients), len(Clients), newRequestNum, diffRequestNum, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients), getRecvDataSize(Clients)/1024.0/1024.0, leftTime)

			elif MaxRequests > 0:
				print dstr, "Clients: %d/%d, Request: %d(+%3d)/%d, ConFail: %d, Timeout: %d, Recv: %.1fM" % \
					(getConnectionCount(Clients), len(Clients), newRequestNum, diffRequestNum, MaxRequests, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients), getRecvDataSize(Clients)/1024.0/1024.0)

			else:
				print dstr, "Clients: %d/%d, Request: %d(+%3d), ConFail: %d, Timeout: %d, Recv: %.1fM" % \
					(getConnectionCount(Clients), len(Clients), newRequestNum, diffRequestNum, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients), getRecvDataSize(Clients)/1024.0/1024.0)

		# 종료 조건 확인
		if MaxRequests > 0 and len(runTimeInfo) >= MaxRequests:
			IsRun = False
			break

		if timeout > 0 and programTimeout < time.time():
			break

		try:
			time.sleep(1)
		except:
			pass
		
		if stepNums != 0:
			steptimeout += 1
			if steptimeout >= intervalTime:
				steptimeout = 0
				newclients = startClients(reactor, runTimeInfo, UrlList, targetClients, timeout, intervalTime, stepNums)
				if newclients==0:
					intervalTime = LastTime
			

	for c in Clients:
		c.isRun = False

	programEndTime = time.time()
	programRunTime = programEndTime - programStartTime
	
	for c in Clients:
		c.join()


	strSummary = getSummary(runTimeInfo, programRunTime, getConnectionSuccessCount(Clients), targetClients, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients))

	print "-----------------------------------------------------------------------"
	print strSummary

#	filename = "c%03d_sizeBasedTime.csv" % targetClients
#	saveSizeBasedTime(filename, runTimeInfo, strSummary)

#	filename = "c%03d_runTimeInfo.csv" % targetClients
#	saveRunTimeInfo(filename, runTimeInfo)

	stats = getSummaryStats(runTimeInfo, programRunTime, getConnectionSuccessCount(Clients), targetClients, getConnectionFailCount(Clients), getSelectTimeoutCount(Clients))
	return stats
Exemplo n.º 15
0
	def handle_input(self):
		try:
			if(self.headerContentLength < 0):
				one = self.sock.recv(4 * 1024)
				self.data += one

				# 요청 완료 여부 확인
				self.headerContentLength = self.getHeaderContentLength()
	
				if self.headerContentLength >= 0:
					self.recvBodySize = self.getRealContentLength()

					if log.getLogLevel() >= 4:
						print "eh %3d: Recv Connection = %s" % (self.fileno, self.getHeaderConnection());
						print "eh %3d: Recv Proxy-Connection = %s" % (self.fileno, self.getHeaderProxyConnection());
	
				if log.getLogLevel() >= 4:
					print "eh %3d: Set headerContentLength = %d" % (self.fileno, self.headerContentLength)
			else:
				one = self.sock.recv(128*1024)
				self.recvBodySize += len(one)

			self.recvDataSize += len(one)
			
		except:
			one = ""

		#print "recv body size : %d, self.headerContentLength  : %d" % (self.recvBodySize, self.headerContentLength)

		# for make network delay
		#time.sleep(0.2)


		# 디버깅 정보 표시
		#if log.getLogLevel() >= 3:
		#	print "eh %3d: recv %10d (+%8d) bytes" % (self.fileno, len(self.data), len(one))

		# 접속 종료
		if len(one) == 0:
			if log.getLogLevel() >= 3:
				print "eh %3d: closed by peer" % (self.fileno)
			self.close()

		# 강제 접속 종료 (1% 확률)
		elif closingProbability > 0 :
			if random.randint(1, 100) <= closingProbability :
				self.close()
				self.activeClose += 1

		# 수신 데이터 처리
		# 기다리는 데이터 사이즈 만큼 수신됐을 때
		if 0 <= self.headerContentLength and self.headerContentLength <= self.recvBodySize:
			self.requestCompleted = True
			endTime = time.time()
			elapsedTime = endTime - self.requestClock

			if log.getLogLevel() >= 1:
				print "eh %3d: request complete. elapsed time %f" % (self.fileno, elapsedTime)

			if self.headerContentLength < self.recvBodySize:
				print "self.headerContentLength[%d] < self.recvBodySize[%d]" % (self.headerContentLength, self.recvBodySize)

			info = [self.URL, elapsedTime, self.recvBodySize, self.requestClock, endTime]
			self.runTimeInfo.append(info)

			self.recvPipelineNum += 1

			# request delay
			if self.requestSleepTime > 0.0:
				try:
					time.sleep(self.requestSleepTime)
				except:
					pass

			# max request check
			if self.MaxRequests > 0 and self.MaxRequests <= len(self.runTimeInfo):
				if self.isConnected:
					self.close()
				return;

			# next request
			if(self.recvPipelineNum >= self.MaxPipelineNum):
				if self.nowRequestPerConnection >= self.MaxRequestPerConnection:
					if self.isConnected:
						self.close()
				else:
					self.sendRequest()

			else:
				self.data = ''
				self.requestCompleted = False
				self.headerContentLength = -1
				self.recvBodySize = 0
				self.recvDataSize = 0