python windows epoll_python中使用epoll开发服务端程序

Python代码:

import socket, logging

import select, errno

logger = logging.getLogger("network-server")

def InitLog():

logger.setLevel(logging.DEBUG)

fh = logging.FileHandler("network-server.log")

fh.setLevel(logging.DEBUG)

ch = logging.StreamHandler()

ch.setLevel(logging.ERROR)

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

ch.setFormatter(formatter)

fh.setFormatter(formatter)

logger.addHandler(fh)

logger.addHandler(ch)

if __name__ == "__main__":

InitLog()

try:

listen_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)

except socket.error, msg:

logger.error("create a socket failed")

try:

listen_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

except socket.error, msg:

logger.error("setsocketopt error")

try:

listen_fd.bind(('', 2003))

except socket.error, msg:

logger.error("listen file id bind ip error")

try:

listen_fd.listen(10)

except socket.error, msg:

logger.error(msg)

try:

epoll_fd = select.epoll()

epoll_fd.register(listen_fd.fileno(), select.EPOLLIN)

except select.error, msg:

logger.error(msg)

connections = {}

addresses = {}

datalist = {}

while True:

epoll_list = epoll_fd.poll()

for fd, events in epoll_list:

if fd == listen_fd.fileno():

conn, addr = listen_fd.accept()

logger.debug("accept connection from %s, %d, fd = %d" % (addr[0], addr[1], conn.fileno()))

conn.setblocking(0)

epoll_fd.register(conn.fileno(), select.EPOLLIN | select.EPOLLET)

connections[conn.fileno()] = conn

addresses[conn.fileno()] = addr

elif select.EPOLLIN & events:

datas = ''

while True:

try:

data = connections[fd].recv(10)

if not data and not datas:

epoll_fd.unregister(fd)

connections[fd].close()

logger.debug("%s, %d closed" % (addresses[fd][0], addresses[fd][1]))

break

else:

datas += data

except socket.error, msg:

if msg.errno == errno.EAGAIN:

logger.debug("%s receive %s" % (fd, datas))

datalist[fd] = datas

epoll_fd.modify(fd, select.EPOLLET | select.EPOLLOUT)

break

else:

epoll_fd.unregister(fd)

connections[fd].close()

logger.error(msg)

break

elif select.EPOLLHUP & events:

epoll_fd.unregister(fd)

connections[fd].close()

logger.debug("%s, %d closed" % (addresses[fd][0], addresses[fd][1]))

elif select.EPOLLOUT & events:

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)

else:

continue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值