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