在GEvent WSGIServer中使用IPv6套接字

0 投票
1 回答
715 浏览
提问于 2025-04-17 15:25

我正在尝试将WSGIServer绑定到一个IPv6的回环地址:

import socket
import gevent
from gevent.pywsgi import WSGIServer

addrs = socket.getaddrinfo('::1', 8000, socket.AF_INET6, 0, socket.SOL_TCP)
bind_spec = addrs[0][-1]

listener = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
listener.bind(bind_spec)

server = WSGIServer(
    listener,
    lambda a,b:'asd'
)

server.serve_forever()

但是这只会得到

error: [Errno 22] Invalid argument

File "/usr/local/lib/python2.7/dist-packages/gevent/server.py", line 122, in _do_accept
  client_socket, address = self.socket.accept()

我试过使用gevent的猴子补丁,但没有帮助。在创建socket之后再导入gevent也没有效果。

我的系统上已经启用了IPv6。如果我用普通的accept()替代服务器构建,socket就能成功绑定并接受连接。

listener.listen(5)
listener.accept()

1 个回答

0

我真是太傻了……GEvent并没有在我提供的socket上自动调用listen(),所以我得自己在创建服务器之前先调用它。

撰写回答