Как узнать, когда все данные были получены элементом управления Winsock, который отправил POST или GET на веб-сервер? - PullRequest
2 голосов
/ 22 июня 2010

Я использую VB6 Winsock control.Когда я выполняю POST на сервере, я получаю ответ в виде нескольких событий прибытия данных.

Как узнать, когда все данные поступили?

(Iя предполагаю, что это происходит, когда происходит событие Winsock_Close)

Ответы [ 3 ]

1 голос
/ 24 июня 2010

В HTTP вы должны проанализировать и проанализировать данные ответа, которые сервер отправляет вам обратно, чтобы узнать, как все это прочитать.

Сначала сервер отправляет обратно список CRLF-строки заголовка с разделителями, которые заканчиваются пустой строкой с разделителями CRLF.Затем вам нужно посмотреть фактические значения заголовков «Content-Length» и «Transfer-Encoding», чтобы узнать, как читать оставшиеся данные.

Если заголовок «Transfer-Encoding» отсутствует, илиесли в нем нет элемента «chunked», то заголовок «Content-Length» указывает, сколько оставшихся байтов нужно прочитать.Но если заголовок «Transfer-Encoding» содержит элемент «chunked», то вы должны прочитать и проанализировать оставшиеся данные по частям, по одному, чтобы знать, когда заканчиваются данные (каждый кусок сообщает свой собственный размер,и последний блок сообщает размер 0).

И нет, вы не можете полагаться на закрытие соединения после отправки ответа, если в заголовке «Connection» явно не указано «close».Для HTTP 1.1 этот заголовок обычно устанавливается как «keep-alive», а это означает, что сокет остается открытым, чтобы клиент мог отправлять больше запросов на один и тот же сокет.* для более подробной информации.

1 голос
/ 22 июня 2010

В прошлом я использовал элементы управления VB6 Winsock, и я определенным образом форматировал свои сообщения, чтобы знать, когда все данные поступили.

Пример: каждое сообщение начинается с «[» и заканчивается «]».

"[Текст сообщения]"

Когда данные поступают из события DataArrival, проверьте конец сообщения "]". Если это так, вы получили как минимум одно целое сообщение и, возможно, начало нового. Если большая часть сообщения ожидает, сохраните данные вашего сообщения в переменной уровня формы и добавьте ее при следующем событии DataArrival.

0 голосов
/ 22 июня 2010

Нет, событие Close не срабатывает, когда все данные поступили, оно срабатывает, когда вы закрываете соединение. Задача контроля Winsock - не знать, когда все данные были переданы, а ваша. В рамках реализации протокола обмена данными между клиентом и сервером вы должны сообщить клиенту, чего ожидать.

Предположим, ваш клиент хочет получить содержимое файла с сервера. Клиент не знает, сколько данных находится в файле. Обмен может идти примерно так:

  • клиент отправляет запрос на данные в файл
  • сервер читает файл, определяет размер, присоединяет размер к началу данных (скажем, использует 4 байта), который сообщает клиенту, сколько данных ожидать, и начинает отправлять его
  • ваш клиентский код знает, что нужно удалить первые 4 байта из всех данных, поступающих после запроса файла, и сохранить их как объем данных, которые должны последовать, а затем накапливать последующие данные через любое количество событий DataArrival до тех пор, пока имеет эту сумму

В идеале сервер также должен добавить контрольную сумму к данным, и вам придется реализовать какой-то механизм тайм-аута, выяснить, что делать, если вы не получите ожидаемый объем данных, и т. Д.

...