gpt4 book ai didi

python - 尝试实现非阻塞 python tcp 多个端口获取奇怪的异常

转载 作者:行者123 更新时间:2023-11-28 23:01:32 26 4
gpt4 key购买 nike

我正在尝试实现一个在多个端口上监听的非阻塞 python tcp 服务器。

我在这个 Stackover posting 中找到了一些代码并修改它以监听多个套接字,到目前为止,一切顺利。

我的代码如下。

#!/usr/bin/python

import select
import socket

ports_list=[7777,7778]


def make_socket(number):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', number))
sock.listen(5)
return sock


read_list= map(lambda x: make_socket(x), ports_list)

print(read_list)

print "Listening on port %s" % ports_list

while True:
readable, writable, errored = select.select(read_list, [], [])
for s in readable:
if s in read_list:
client_socket, address = s.accept()
read_list.append(client_socket)
print "Connection from", address
else:
data = s.recv(1024)
if data:
s.send(data)
else:
s.close()
read_list.remove(s)

我通过在另一个控制台运行 netcat 来测试它

$ netcat localhost 7778
dsa

但是很麻烦,就像这样:

/tcp_non_blocking_listener.py
[<socket._socketobject object at 0xb72804fc>, <socket._socketobject object at 0xb7280534>]
Listening on port [7777, 7778]
Connection from ('127.0.0.1', 41237)
Traceback (most recent call last):
File "./tcp_non_blocking_listener.py", line 27, in <module>
client_socket, address = s.accept()
File "/usr/lib/python2.7/socket.py", line 202, in accept
sock, addr = self._sock.accept()
socket.error: [Errno 22] Invalid argument

我刚刚开始使用 python 非阻塞 API,执行此类操作的惯用方法是什么?

最佳答案

您将未接受的套接字与已接受的套接字不匹配。

你的固定代码(引入了 notAccepted 套接字的列表):

#!/usr/bin/python

import select
import socket

ports_list=[7777,7778]


def make_socket(number):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', number))
sock.listen(5)
return sock


read_list= map(lambda x: make_socket(x), ports_list)

print(read_list)

print "Listening on port %s" % ports_list

notAccepted = read_list[:]

while True:
readable, writable, errored = select.select(read_list, [], [])
for s in readable:
if s in notAccepted:
client_socket, address = s.accept()
read_list.append(client_socket)
print "Connection from", address, client_socket
else:
data = s.recv(1024)
if data:
s.send(data)
else:
s.close()
read_list.remove(s)

关于python - 尝试实现非阻塞 python tcp 多个端口获取奇怪的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10968659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com