我有一个TCP处理数据流。一次需要4096个字节,但我需要一种方法在接收之前找出整个套接字的大小。这样我就可以确定在它切换套接字之前,该套接字将被读取多少次。它还将通知这是这个套接字的最后一次接收,以便在select切换到另一个套接字(当它可用)之前,我可以对它做些什么。在
def handle_tcp(self, sock, remote):
fdset = [sock, remote]
while True:
r, w, e = select.select(fdset, [], [])
# How to find out how much bytes need to be read from socket?
if sock in r:
non_blocking_calculation()
if remote.send(sock.recv(4096)) <= 0: break
if remote in r:
non_blocking_calculation()
if sock.send(remote.recv(4096)) <= 0: break
Linux和Windows有FIONREAD(同义词SIOCINQ)ioctl。在
Python在socket和fcntl模块中对ioctl的支持有限,但在通常的TCP编程中,这样的ioctl并没有得到广泛的应用。通常,您只需设置blocking(false)并读取所有可用数据,直到BlockingIOError升高。或者用指定大小/边界的头/标记定义某种类型的消息。在
你打败了我。按照伊戈尔·卡里诺夫斯基的方式。您可以使用FIONREAD来执行此操作,也可以使用MSG\u PEEK并一直读到空。例如,
select()
之后。在相关问题 更多 >
编程相关推荐