如何在Python中找到recv之前在socket中有多少字节?

2024-10-01 13:28:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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  

Tags: toinsendifremoteblockingselect数据流
2条回答

LinuxWindowsFIONREAD(同义词SIOCINQ)ioctl。在

Python在socketfcntl模块中对ioctl的支持有限,但在通常的TCP编程中,这样的ioctl并没有得到广泛的应用。通常,您只需设置blockingfalse)并读取所有可用数据,直到BlockingIOError升高。或者用指定大小/边界的头/标记定义某种类型的消息。在

你打败了我。按照伊戈尔·卡里诺夫斯基的方式。您可以使用FIONREAD来执行此操作,也可以使用MSG\u PEEK并一直读到空。例如,select()之后。在

import fcntl, termios, array, math
...
sock_size = array.array('i', [0])  # initialise outside While loop
if sock in r:
    fcntl.ioctl(sock, termios.FIONREAD, sock_size)
    count = ceil(sock_size[0] / float(BUF_SIZE))
    print("Socket size: {} and count: {}".format(sock_size[0], count)

相关问题 更多 >