Quero ler todos os bytes disponíveis no buffer, o código abaixo lido por blocos de 100 bytes.
1) É possível ler todos os bytes que estão no buffer?
2) qual é o valor padrão de sock.recv ()? // sem argumento
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 1489)
sock.connect(server_address)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 8192) # Buffer size 8192
sock.setblocking(0) # set non-blocking
while 1:
read_ready = select.select([sock], [], [], timeout_in_seconds)
if read_ready[0]: # we have what to read
print('ready')
data = sock.recv(100)
if not data:
break
print(data)
UPD: 3) E se eu definir sock.recv (1000000), ele lerá todo o buffer, certo? (suponha que a velocidade dos dados seja muito menor)
O objetivo principal é ler continuamente um fluxo
1) É possível ler todos os bytes que estão no buffer?
recv
não tem ideia de quantos bytes estão no buffer de soquete ou quantos podem chegar ao tentar ler do buffer. Mas você pode usar recv
em um soquete sem bloqueio e ler até obter um erro porque não há mais dados disponíveis (errno.EWOULDBLOCK). Ou você pode usar um tempo limite zero ( 0
, não None
) em select.select para apenas verificar (pesquisar) se ainda há dados para ler.
2) qual é o valor padrão de sock.recv ()? // sem argumento
A documentação pararecv
diz claramente como essa função precisa ser chamada:
socket.recv (bufsize [, sinalizadores])
Portanto, bufsize
não há argumento que você pode pular e sua tentativa de fazer isso deve resultar em um erro.
3) E se eu definir sock.recv (1000000), ele lerá todo o buffer, certo?
Ele só lerá até o número determinado de bytes. A quantidade de dados que ele irá ler na realidade também dependerá do tamanho do buffer de soquete subjacente no kernel, ou seja, ele não pode ler nenhum dado que ainda não esteja no buffer de soquete, mesmo que o cliente já os tenha enviado.
Outra restrição se aplica se o soquete for um soquete SSL. Nesse caso recv
, geralmente retornará apenas os dados do quadro SSL atual.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras