N байт?
предположим у нас есть:
buf := make([]byte, 32)
n, err := conn.Read(buf)
n, предположим, присвоено 20. а err == nil. по какому принципу чтение прекратилось? почему не дожитается всех 32 байт?
странный вопрос
ядро получает сегменты, смотрит на сиквенсы и отсылает передающей стороне (s)ack на них. но лучше посмотреть в книжку https://www.litres.ru/yon-sneyder/effektivnoe-programmirovanie-tcp-ip-45707295/
потому что в ядре сокет имеет пару буферов(для чтения и записи, регулируются через setsockopt SO_RCVBUF/SO_SNDBUF). Когда вы зовёте read/recv в предоставленный буфер данные копируются. Если в ядре непрочитанных данных больше чем буфер что вы предоставили - вам положат что есть
Обсуждают сегодня