2010-06-22 5 views
2

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

Знаете ли вы, когда все Данные поступили?

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

ответ

1

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

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

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

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

0

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

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

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

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

1

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

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

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

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

Прочтите RFC 2616 для более подробной информации.