@@ -161,44 +161,36 @@ def recv(self, bufsize=0):
161
161
gc .collect ()
162
162
return ret
163
163
164
- def recv_into (self , buffer , nbytes = 0 ):
165
- """Read some bytes from the connected remote address into a given buffer
164
+ def recv_into (self , buffer , nbytes : int = 0 ):
165
+ """Read bytes from the connected remote address into a given buffer.
166
166
167
- :param bytearray buffer: The buffer to read into
168
- :param int nbytes: (Optional) Number of bytes to receive default is 0,
169
- which will receive as many bytes as possible before filling the
167
+ :param bytearray buffer: the buffer to read into
168
+ :param int nbytes: maximum number of bytes to receive; if 0,
169
+ receive as many bytes as possible before filling the
170
170
buffer or timing out
171
171
"""
172
-
173
172
if not 0 <= nbytes <= len (buffer ):
174
- raise ValueError (
175
- "Can only read number of bytes between 0 and length of supplied buffer"
176
- )
177
-
178
- stamp = time .monotonic ()
179
- to_read = len (buffer )
180
- limit = 0 if nbytes == 0 else to_read - nbytes
181
- received = []
182
- while to_read > limit :
183
- # print("Bytes to read:", to_read)
184
- avail = self .available ()
185
- if avail :
186
- stamp = time .monotonic ()
187
- recv = _the_interface .socket_read (self ._socknum , min (to_read , avail ))
188
- received .append (recv )
189
- start = len (buffer ) - to_read
190
- to_read -= len (recv )
191
- end = len (buffer ) - to_read
192
- buffer [start :end ] = bytearray (recv )
193
- gc .collect ()
194
- elif received :
195
- # We've received some bytes but no more are available. So return
196
- # what we have.
173
+ raise ValueError ("nbytes must be 0 to len(buffer)" )
174
+
175
+ last_read_time = time .monotonic ()
176
+ num_to_read = len (buffer ) if nbytes == 0 else nbytes
177
+ num_read = 0
178
+ while num_read < num_to_read :
179
+ num_avail = self .available ()
180
+ if num_avail > 0 :
181
+ last_read_time = time .monotonic ()
182
+ bytes_read = _the_interface .socket_read (
183
+ self ._socknum , min (num_to_read , num_avail )
184
+ )
185
+ buffer [num_read : num_read + len (bytes_read )] = bytes_read
186
+ num_read += len (bytes_read )
187
+ elif num_read > 0 :
188
+ # We got a message, but there are no more bytes to read, so we can stop.
197
189
break
198
- if self ._timeout > 0 and time .monotonic () - stamp > self ._timeout :
190
+ # No bytes yet, or more byte requested.
191
+ if self ._timeout > 0 and time .monotonic () - last_read_time > self ._timeout :
199
192
break
200
- gc .collect ()
201
- return len (buffer ) - to_read
193
+ return num_read
202
194
203
195
def read (self , size = 0 ):
204
196
"""Read up to 'size' bytes from the socket, this may be buffered internally!
0 commit comments