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)
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
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
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
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
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)
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)
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
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)
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
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
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]))
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
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
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