如何解决 python 中 TCP 套接字中客户端的阻塞问题?
How can I solve the blocking problem on the client part in a TCP socket in python?
我有一个 TCP python 客户端,它用 C++ 向 TCP 服务器发出请求。我无权访问服务器,因此无法更改服务器部分的任何代码。
问题是有时客户端发出的请求没有收到服务器部分的任何数据,因此程序在 data = sock.recv(1024)
行中被阻塞。
所以我想知道如何解决这个问题。如果没有收到数据,我尝试在该行之后放置一个条件,但我无法通过 data = sock.recv(1024)
行。
try:
data = sock.recv(12) # this always gets data, it is a message send by the server that verifies the connection is alright
print("Received: ", ":".join("{:02x}".format(c) for c in data))
data = sock.recv(1024)
print("Received: ", ":".join("{:02x}".format(c) for c in data))
except IOError as e:
pass
您需要为使用 socket.settimeout(N)
或 socket.setdefaulttimeout(N)
的阻止操作设置超时。这样的话,如果N秒没有收到数据,操作就会失败。
第二种选择是使用 non-blocking IO。
我有一个 TCP python 客户端,它用 C++ 向 TCP 服务器发出请求。我无权访问服务器,因此无法更改服务器部分的任何代码。
问题是有时客户端发出的请求没有收到服务器部分的任何数据,因此程序在 data = sock.recv(1024)
行中被阻塞。
所以我想知道如何解决这个问题。如果没有收到数据,我尝试在该行之后放置一个条件,但我无法通过 data = sock.recv(1024)
行。
try:
data = sock.recv(12) # this always gets data, it is a message send by the server that verifies the connection is alright
print("Received: ", ":".join("{:02x}".format(c) for c in data))
data = sock.recv(1024)
print("Received: ", ":".join("{:02x}".format(c) for c in data))
except IOError as e:
pass
您需要为使用 socket.settimeout(N)
或 socket.setdefaulttimeout(N)
的阻止操作设置超时。这样的话,如果N秒没有收到数据,操作就会失败。
第二种选择是使用 non-blocking IO。