Skip to content

Instantly share code, notes, and snippets.

@xiazhibin
Last active March 4, 2017 12:24
Show Gist options
  • Save xiazhibin/e564c6eab9f727bb5b95e71f8a66fa9a to your computer and use it in GitHub Desktop.
Save xiazhibin/e564c6eab9f727bb5b95e71f8a66fa9a to your computer and use it in GitHub Desktop.
py_epoll.py
import socket
import select, errno
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(('0.0.0.0', 8888))
serversocket.listen(1)
serversocket.setblocking(0)
epoll_fd = select.epoll()
epoll_fd.register(serversocket.fileno(), select.EPOLLIN)
datalist = {}
connections = {}
try:
while True:
events = epoll_fd.poll(1)
for fd, event in events:
if fd == serversocket.fileno():
connection, address = serversocket.accept()
connection.setblocking(0)
epoll_fd.register(connection.fileno(), select.EPOLLIN)
connections[connection.fileno()] = connection
elif event & select.EPOLLIN:
datas = ''
while True:
try:
data = connections[fd].recv(1024)
if not data and not datas:
epoll_fd.unregister(fd)
connections[fd].close()
del connections[fd]
else:
datas += datas
except socket.error, e:
if e.errno == errno.EAGAIN:
datalist[fd] = datas
epoll_fd.modify(fd, select.EPOLLET | select.EPOLLOUT)
break
else:
epoll_fd.unregister(fd)
connections[fd].close()
del connections[fd]
break
elif event & select.EPOLLOUT:
sendLen = 0
while True:
sendLen += connections[fd].send(datalist[fd][sendLen:])
if sendLen == len(datalist[fd]):
break
epoll_fd.modify(fd, select.EPOLLIN | select.EPOLLET)
elif event & select.EPOLLHUP:
epoll_fd.unregister(fd)
connections[fd].close()
del connections[fd]
else:
continue
finally:
epoll_fd.unregister(serversocket.fileno())
epoll_fd.close()
serversocket.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment