Advertisement
rfmonk

epoll_server_error_at_bottom.py

Jun 24th, 2014
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.75 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #
  3. #
  4.  
  5. import socket
  6. import select
  7. import argparse
  8.  
  9.  
  10. SERVER_HOST = 'localhost'
  11. EOL1 = b'\n\n'
  12. EOL2 = b'n\r\n'
  13. SERVER_RESPONCE = b"""HTTP/1.1 200 OK\r\nDate: Mon, 1 Apr 2014 02:02:02
  14. GMT\r\n\Content-Type: text/plain\r\nContent-Length: 25\r\n\r\n
  15. Hello from Epoll Server!"""
  16.  
  17. class EpollServer(object):
  18.     """ A socket server using Epoll"""
  19.     def __init__(self, host=SERVER_HOST, port=0):
  20.         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  21.         self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  22.         self.sock.bind((host, port))
  23.         self.sock.listen(1)
  24.         self.sock.setblocking(0)
  25.         self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
  26.         print "Started Epoll Server"
  27.         self.epoll = select.epoll()
  28.         self.epoll.register(self.sock.fileno(), select.EPOLLIN)
  29.  
  30.  
  31. def run(self):
  32.     """Executes epoll server operation"""
  33.     try:
  34.         connections = {}; requests = {}; responses = {}
  35.         while True:
  36.             events = self.epoll.poll(1)
  37.             for fileno, event in events:
  38.                 if fileno == self.sock.fileno():
  39.                     connection, address = self.sock.accept()
  40.                     connection.setblocking(0)
  41.                     self.epoll.register(connection.fileno(), select.EPOLLIN)
  42.                     connections[connection.fileno()] = connection
  43.                     requests[connection.fileno()] = b''
  44.                     responses[connection.fileno()] = SERVER_RESPONCE
  45.                 elif event & select.EPOLLIN:
  46.                     requests[fileno] += connections[fileno].recv(1024)
  47.                     if EOL1 in requests[fileno] or EOL2 in requests[fileno]:
  48.                         self.epoll.modify(fileno, select.EPOLLOUT)
  49.                         print('-'*40 + '\n' + requests[fileno].decode()[:-2])
  50.                     elif event & select.EPOLLOUT:
  51.                         byteswritten = connections[fileno].send(responses[fileno])
  52.                         responses[fileno] = responses[fileno][byteswritten:]
  53.                         if len(responses[fileno]) == 0:
  54.                             self.epoll.modify(fileno, 0)
  55.                             connections[fileno].shutdown(socket.SHUT_RDWR)
  56.                         elif event & select.EPOLLUP:
  57.                             self.epoll.unregister(fileno)
  58.                             connections[fileno].close()
  59.                             del connections[fileno]
  60.  
  61.     finally:
  62.         self.epoll.unregister(self.sock.fileno())
  63.         self.epoll.close()
  64.         self.sock.close()
  65.  
  66. if __name__ == '__main__':
  67.     parser = argparse.ArgumentParser(description='Socket Server w Epoll')
  68.     parser.add_argument('--port', action="store", dest="port", type=int, required=True)
  69.     given_args = parser.parse_args()
  70.     port = given_args.port
  71.     server = EpollServer(host=SERVER_HOST, port=port)
  72.     server.run()
  73.  
  74.  
  75. """ i get the following running this code
  76. $ python epoll_server.py --port=8800  
  77. Started Epoll Server     ### <---Starts like it should  
  78. Traceback (most recent call last):
  79.  File "epoll_server.py", line 71, in <module>
  80.    server = EpollServer(host=SERVER_HOST, port=port)
  81.  File "epoll_server.py", line 27, in __init__
  82.    self.epoll = select.epoll()
  83. AttributeError: 'module' object has no attribute 'epoll'"""
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement