@minotavr1712

Почему дублируются байты, которые не влезли в размер буффера, при получении с помощью socket.recv?

Клиент:
self.serv_sock.send(CCoinPackage(pkg_type='ask_for_peers').package_data())


Сервер:
BUF_SIZE = 12
while not self.STOP_FLAG.is_set():
            try:
                buff = self.sock.recv(constants.BUF_SIZE)
                print(buff)
                
                if buff != b'':
                    message_ended = False
                    
                    while not message_ended:
                        self.sock.settimeout(self.sock_timeout)
                        
                        try:
                            data = self.sock.recv(constants.BUF_SIZE)
                        except socket.timeout:
                            message_ended = True
                        
                        
                        buff += data
                        print(len(buff))
                        print(buff)
                    
                    print(CCoinPackage(got_bytes=buff).unpackage_data())

            except socket.timeout:
                continue

            except socket.error as e:
                raise e


Вывод:
b'\x00\x00\x00\x05\x16\x9d\x00\x00\xb3\xdb"p'
24
b'\x00\x00\x00\x05\x16\x9d\x00\x00\xb3\xdb"p\x97\xc95\x99\xff\x94\x81\x8e$#\x0eW'
36
b'\x00\x00\x00\x05\x16\x9d\x00\x00\xb3\xdb"p\x97\xc95\x99\xff\x94\x81\x8e$#\x0eW\xba\xb8\xe1\xe1\xb6`\x9f\x81\xf3\x96\xd4:'
48
b'\x00\x00\x00\x05\x16\x9d\x00\x00\xb3\xdb"p\x97\xc95\x99\xff\x94\x81\x8e$#\x0eW\xba\xb8\xe1\xe1\xb6`\x9f\x81\xf3\x96\xd4:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
52
b'\x00\x00\x00\x05\x16\x9d\x00\x00\xb3\xdb"p\x97\xc95\x99\xff\x94\x81\x8e$#\x0eW\xba\xb8\xe1\xe1\xb6`\x9f\x81\xf3\x96\xd4:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
56
b'\x00\x00\x00\x05\x16\x9d\x00\x00\xb3\xdb"p\x97\xc95\x99\xff\x94\x81\x8e$#\x0eW\xba\xb8\xe1\xe1\xb6`\x9f\x81\xf3\x96\xd4:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'


Также протестировал, поигрался с размером буффера, и всегда выходит так, что если размер буфера = N, то количество добавляемых нулей в конце всегда len(sent_data) % N. То есть в последний раз почитал действительных 4 байта, а потом опять 4 нуля добавил. Также если это были не нули, а какая-то другая последовательность байт, то отправляется повторно она же. Почему так происходит и как этого избежать адекватно (не не учитывать последнюю итерацию)? Ну и узнать хочется почему так
  • Вопрос задан
  • 65 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
try:
                            data = self.sock.recv(constants.BUF_SIZE)
                        except socket.timeout:
                            message_ended = True

                        buff += data

Если отработает except, предыдущее значение data не изменится, и к buff оно ВСЁ РАВНО приклеится.
Закинь buff += data в ветку try-else.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы