Все операции чтения в сокете TCP будут возвращаться в любом месте от 1 байта до общего объема, отправленного в зависимости от размера буфера, который вы предоставляете.Вероятно, происходит то, что веб-сервер отправляет данные в виде двух отдельных записей, и это происходит, когда стек TCP сервера передается в виде двух отдельных блоков данных.Ваше чтение завершено, потому что данные поступили.Чтение не ожидает до тех пор, пока все данные, которые, как вы ожидаете, программист, не получили, или даже до тех пор, пока ваш буфер не заполнится.
Проблемы с сетью могут еще больше запутать вопросы, поскольку маршрутизаторы могут фрагментировать объекты, а потерянные данные могут задерживать события, покаон повторно отправляется.
Всегда при работе с TCP вы должны предполагать, что ваши чтения всегда будут возвращать только один байт за раз и код соответственно;таким образом все будет работать всегда.
Вам нужно просто выполнить еще одно чтение, и вы получите остальные данные, когда они поступят.
Возможно, вы захотите взглянуть на мой бесплатныйПлатформа IOCP-сервера (она тоже работает с клиентами), которую можно найти здесь ;Похоже, у вас уже все работает, но иногда помогает взглянуть на другой способ работы.
Когда мне нужно накапливать данные перед обработкой, я склоняюсь к следующему подходу.Выпустите чтение и дождитесь его завершения, посмотрите, что у меня есть, и, если у меня нет всего, что мне нужно, и в моем буфере все еще есть место, отрегулируйте WSABUF
, который я использую, чтобы он указывал наконец текущих данных, которые только что поступили в тот же буфер и выполнили еще одно чтение;затем мы накапливаемся в том же буфере, пока либо у меня не будет достаточно данных для обработки, либо мне нужно добавить еще один буфер, чтобы получить еще немного.