我有一个TCP处理数据流 . 它一次需要4096个字节,但我需要一种方法来在它恢复之前找出整个套接字大小 . 这样我就可以确定在切换套接字之前读取套接字的次数 . 它还会通知这是这个套接字的最后一个recv,这样我就可以在选择切换到另一个套接字之前使用它 .
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
2 回答
你打败了我 . 按照Igor Kalinosvkiy的方式 . 您可以使用 FIONREAD 执行此操作或使用 MSG_PEEK 并继续读取直到空 . 例如,在
select()
之后 .Linux和Windows有 FIONREAD (同义词 SIOCINQ )ioctl .
Python在 socket 和 fcntl 模块中限制了ioctl的支持,但在通常的TCP编程中,ioctl并没有被广泛使用 . 通常你只是 setblocking (false)并读取所有可用数据,直到BlockingIOError引发 . Ore定义某种带有 Headers /标记的消息,指定大小/边界 .