Blame tests/functionality/iomux/eserver.py

Packit Service aa3af4
#!/usr/bin/env python
Packit Service aa3af4
# Written By: Avner BenHanoch
Packit Service aa3af4
# Date: 2011-03-08
Packit Service aa3af4
"""
Packit Service aa3af4
epoll server test program, identical to the select server.py test program 
Packit Service aa3af4
that uses epoll instead of select
Packit Service aa3af4
Packit Service aa3af4
can be used with the select client.py test program
Packit Service aa3af4
Packit Service aa3af4
NOTE: epoll is only supported in python 2.6 and above
Packit Service aa3af4
"""
Packit Service aa3af4
Packit Service aa3af4
import select
Packit Service aa3af4
import socket
Packit Service aa3af4
import sys
Packit Service aa3af4
import time
Packit Service aa3af4
Packit Service aa3af4
Packit Service aa3af4
HOST = ''         # IP for listening on
Packit Service aa3af4
if len (sys.argv) > 1: HOST = sys.argv[1]
Packit Service aa3af4
PPORT = 50007     # pyload port
Packit Service aa3af4
CPORT = PPORT + 1 # ctrl port
Packit Service aa3af4
SIZE = 8192      # size of recv buf
Packit Service aa3af4
backlog = 1
Packit Service aa3af4
Packit Service aa3af4
def print_info (msg):
Packit Service aa3af4
	print "INFO: ", msg
Packit Service aa3af4
 
Packit Service aa3af4
Packit Service aa3af4
#server for payload channel 
Packit Service aa3af4
pserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Packit Service aa3af4
pserver.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
Packit Service aa3af4
pserver.bind((HOST,PPORT))
Packit Service aa3af4
pserver.listen(backlog)
Packit Service aa3af4
Packit Service aa3af4
#server for ctrl channel 
Packit Service aa3af4
cserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Packit Service aa3af4
cserver.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
Packit Service aa3af4
cserver.bind((HOST,CPORT))
Packit Service aa3af4
cserver.listen(backlog)
Packit Service aa3af4
Packit Service aa3af4
Packit Service aa3af4
psocket = None #connected payload socket
Packit Service aa3af4
csocket = None #connected  ctrl   socket
Packit Service aa3af4
Packit Service aa3af4
totalBytes = 0
Packit Service aa3af4
timeout = 1000
Packit Service aa3af4
Packit Service aa3af4
epfd = select.epoll()
Packit Service aa3af4
epfd.register(pserver.fileno(), select.EPOLLIN)
Packit Service aa3af4
epfd.register(cserver.fileno(), select.EPOLLIN)
Packit Service aa3af4
Packit Service aa3af4
while True:
Packit Service aa3af4
	print_info ("waiting for traffic; sleeping %d seconds on epoll..." % timeout) #dbg
Packit Service aa3af4
	events = epfd.poll(timeout)
Packit Service aa3af4
	print_info ("--------> epoll returned %d input fds" % len(events) ) #dbg
Packit Service aa3af4
	
Packit Service aa3af4
	for fileno, event in events:
Packit Service aa3af4
		if cserver and fileno == cserver.fileno(): # new connection on ctrl server socket
Packit Service aa3af4
			if csocket:  raise Exception ("payload socket is already connected")
Packit Service aa3af4
			csocket, address = cserver.accept()
Packit Service aa3af4
			epfd.register(csocket.fileno(), select.EPOLLIN)
Packit Service aa3af4
			print_info ("accepted ctrl socket; peer=%s" % str(address))
Packit Service aa3af4
			
Packit Service aa3af4
		elif pserver and fileno == pserver.fileno(): # new connection on payload server socket
Packit Service aa3af4
			if psocket:  raise Exception ("payload socket is already connected")
Packit Service aa3af4
			psocket, address = pserver.accept()
Packit Service aa3af4
			epfd.register(psocket.fileno(), select.EPOLLIN)
Packit Service aa3af4
			print_info ("accepted payload socket; peer=%s" % str(address))
Packit Service aa3af4
			
Packit Service aa3af4
		elif csocket and fileno == csocket.fileno(): #data on ctrl socket
Packit Service aa3af4
			buf = csocket.recv(SIZE)
Packit Service aa3af4
			if buf:
Packit Service aa3af4
				print_info ("got instruction on ctrl socket")
Packit Service aa3af4
				t = float(buf)
Packit Service aa3af4
				print_info (">>> going to sleep for %f seconds..." % t)
Packit Service aa3af4
				t1 = time.time()
Packit Service aa3af4
				time.sleep(t)
Packit Service aa3af4
				t2 = time.time()
Packit Service aa3af4
				print_info ("<<< sleep was finished after %f seconds" % (t2-t1))
Packit Service aa3af4
			else: #EOF
Packit Service aa3af4
				print_info ("got EOF on ctrl socket")
Packit Service aa3af4
				epfd.unregister(csocket.fileno())
Packit Service aa3af4
				csocket.close()
Packit Service aa3af4
				csocket = None
Packit Service aa3af4
				if psocket: timeout = 1 # wait for ordinary close of payload socket
Packit Service aa3af4
		
Packit Service aa3af4
		elif psocket and fileno == psocket.fileno() : #data on payload socket
Packit Service aa3af4
			buf = psocket.recv(SIZE)
Packit Service aa3af4
			if buf:
Packit Service aa3af4
				size = len(buf)
Packit Service aa3af4
				print_info ("got data on payload socket; len is: %d" % size) #dbg
Packit Service aa3af4
				totalBytes += size
Packit Service aa3af4
			else: #EOF
Packit Service aa3af4
				print_info (" ====> got EOF on payload socket; total bytes received: %d <<=====" % totalBytes)
Packit Service aa3af4
				totalBytes = 0
Packit Service aa3af4
				epfd.unregister(psocket.fileno())
Packit Service aa3af4
				psocket.close()
Packit Service aa3af4
				psocket = None
Packit Service aa3af4
				if csocket: timeout = 1 # wait for ordinary close of ctrl socket
Packit Service aa3af4
				
Packit Service aa3af4
	if not events: #timeout
Packit Service aa3af4
		print_info ("epoll (%d seconds) timeout" % timeout)
Packit Service aa3af4
		if csocket:
Packit Service aa3af4
			print_info ("closing ctrl socket")
Packit Service aa3af4
			epfd.unregister(csocket.fileno())
Packit Service aa3af4
			csocket.close()
Packit Service aa3af4
			csocket = None
Packit Service aa3af4
		if psocket:
Packit Service aa3af4
			print_info (" ====> closing payload socket (without EOF); total bytes received: %d <<=====" % totalBytes)
Packit Service aa3af4
			totalBytes = 0
Packit Service aa3af4
			epfd.unregister(psocket.fileno())
Packit Service aa3af4
			psocket.close()
Packit Service aa3af4
			psocket = None
Packit Service aa3af4
		timeout = 1000
Packit Service aa3af4
				
Packit Service aa3af4
Packit Service aa3af4
if pserver: pserver.close()
Packit Service aa3af4
if cserver: cserver.close()
Packit Service aa3af4
if psocket: psocket.close()
Packit Service aa3af4
if csocket: csocket.close()
Packit Service aa3af4
if epfd:    epfd.close()