首页 文章

如何在Python中的recv之前找出套接字中的字节数?

提问于
浏览
0

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

  • 1

    你打败了我 . 按照Igor Kalinosvkiy的方式 . 您可以使用 FIONREAD 执行此操作或使用 MSG_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)
    
  • 2

    LinuxWindowsFIONREAD (同义词 SIOCINQ )ioctl .

    Python在 socketfcntl 模块中限制了ioctl的支持,但在通常的TCP编程中,ioctl并没有被广泛使用 . 通常你只是 setblocking (false)并读取所有可用数据,直到BlockingIOError引发 . Ore定义某种带有 Headers /标记的消息,指定大小/边界 .

相关问题