[New-bugs-announce] [issue21819] Remaining buffer from socket isn't available anymore after calling socket.recv the first time

Sworddragon report at bugs.python.org
Sat Jun 21 07:04:51 CEST 2014


New submission from Sworddragon:

If I'm receiving data from a socket (several bytes) and making the first call to socket.recv(1) all is fine but the second call won't get any further data. But doing this again with socket.recv(2) instead will successfully get the 2 bytes. Here is a testcase:


Script:

def icmp_packet(type, code, data):
	length_data = len(data)
	if length_data % 2 == 1:
		data += b'\x00'
	checksum = code | type << 8
	i = 0
	while i < length_data:
		checksum += data[i + 1] | data[i] << 8
		checksum = (checksum & 65535) + (checksum >> 16)
		i += 2
	return bytes([type]) + bytes([code]) + (checksum ^ 65535).to_bytes(2, 'big') + data

import socket

connection = socket.socket(proto = socket.IPPROTO_ICMP, type = socket.SOCK_RAW)
connection.settimeout(1)
connection.sendto(icmp_packet(8, 0, b'\x00\x00\x00\x00'), ('8.8.8.8', 0))
print(connection.recv(2))
connection.close()
connection = socket.socket(proto = socket.IPPROTO_ICMP, type = socket.SOCK_RAW)
connection.settimeout(1)
connection.sendto(icmp_packet(8, 0, b'\x00\x00\x00\x00'), ('8.8.8.8', 0))
print(connection.recv(1))
print(connection.recv(1))
connection.close()


Here is the result:

root at ubuntu:/home/sworddragon/tmp# python3 test.py
b'E\x00'
b'E'
Traceback (most recent call last):
  File "test.py", line 24, in <module>
    print(connection.recv(1))
socket.timeout: timed out

----------
components: Library (Lib)
messages: 221155
nosy: Sworddragon
priority: normal
severity: normal
status: open
title: Remaining buffer from socket isn't available anymore after calling socket.recv the first time
type: behavior
versions: Python 3.4

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue21819>
_______________________________________


More information about the New-bugs-announce mailing list