master.py 文件源码

python
阅读 35 收藏 0 点赞 0 评论 0

项目:docklet 作者: unias 项目源码 文件源码
def run_forever():
        listen_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
        listen_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        listen_fd.bind(('', master_connector.tcp_port))
        listen_fd.listen(master_connector.max_minions)

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

        datalist = {}

        master_connector.establish_vswitch('master')
        try:
            while True:
                epoll_list = master_connector.epoll_fd.poll()
                for fd, events in epoll_list:
                    if fd == listen_fd.fileno():
                        fileno, addr = listen_fd.accept()
                        fileno.setblocking(0)
                        master_connector.epoll_fd.register(fileno.fileno(), select.EPOLLIN | select.EPOLLET)
                        master_connector.conn[fileno.fileno()] = (fileno, addr[0])
                        master_connector.build_gre_conn('master', addr[0])
                    elif select.EPOLLIN & events:
                        datas = b''
                        while True:
                            try:
                                data = master_connector.conn[fd][0].recv(10)
                                if not data and not datas:
                                    master_connector.close_connection(fd)
                                    break
                                else:
                                    datas += data
                            except socket.error as msg:
                                if msg.errno == errno.EAGAIN:
                                    try:
                                        datalist[fd] = master_connector.do_message_response(datas)
                                        master_connector.epoll_fd.modify(fd, select.EPOLLET | select.EPOLLOUT)
                                    except:
                                        master_connector.close_connection(fd)
                                else:
                                    master_connector.close_connection(fd)
                                break
                    elif select.EPOLLOUT & events:
                        sendLen = 0
                        while True:
                            sendLen += master_connector.conn[fd][0].send(datalist[fd][sendLen:])
                            if sendLen == len(datalist[fd]):
                                break
                        master_connector.epoll_fd.modify(fd, select.EPOLLIN | select.EPOLLET)
                    elif select.EPOLLHUP & events:
                        master_connector.close_connection(fd)
                    else:
                        continue
        finally:
            os.system('ovs-vsctl del-br ovs-master >/dev/null 2>&1')
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号