Perché non Python socket.send restituisce il numero di byte inviati come documentazione dice?

voti
0

Secondo la documentazione , Python socket.send():

Restituisce il numero di byte inviati.

Tuttavia, quando lo uso, sembra di tornare il byte che è stato lo scorso mandato, non il numero totale di byte inviati. Considerate questo codice:

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('localhost', 12345))
>>> r = s.send(bytes(1))
>>> print(r)
1
>>> r = s.send(bytes(15))
>>> print(r)
15
>>> r = s.send(bytes(150))
>>> print(r)
150
>>> r = s.send(bytes(255))
>>> print(r)
255
>>> r = s.send(bytes(0))
>>> print(r)
0

Questo SO posta sembra legata , anche se non risponde alla mia domanda.

Quello che mi aspetto di vedere è r == 1per ogni linea.

risolto:

Capito. Questo funziona:

>>> y = bytearray(1)
>>> y[0] = 125
>>> r = s.send(y)
>>> print(r)
1

La ragione per cui ho messo bytes()lì per cominciare, è perché senza di essa si ottiene:

>>> r = s.send(125)
TypeError: a bytes-like object is required, not 'int'
È pubblicato 16/08/2017 alle 17:03
dall'utente
In altre lingue...                            


2 risposte

voti
3

Come la documentazione per bytesesempio, se l'argomento è un intero, poi crea un ByteArray di quel formato.

https://docs.python.org/3.1/library/functions.html#bytes https://docs.python.org/3.1/library/functions.html#bytearray

Forse questo è ciò che si intende fare?

In [26]: r = s.send(b'250')

In [27]: r
Out[27]: 3

Ma anche allora b'250'restituisce 3.

Risposto il 16/08/2017 a 17:10
fonte dall'utente

voti
0

La confusione è come Python 2.xe Python 3.x utilizzano la bytes()funzione.

In python3, bytes(100)valuterà a 100 byte matrice binaria riempiti con zeri. ( Documentazione API ) questa deve essere la versione di Python si sta eseguendo in quanto questo comportamento è coerente con l'output.

In python2, bytes(100)valuterà a '100'. Converte il numero intero in una stringa e quindi assegna il ByteArray a tale valore. Facendo help(bytes)su esso dimostra che è in realtà lo stesso come oggetto incorporato str. Quindi, in python2 bytes(100)si comporta come str(100).

Anche nei tuoi esempi, anche in base al vostro comportamento python2 previsto, il valore di ritorno non sarebbe stato sempre 1. Sarebbe la lunghezza della stringa, che sarebbe lo stesso del numero di cifre del numero intero, ad esempio 3nel caso di bytes(100).

Risposto il 16/08/2017 a 17:31
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more