![]() |
[Delphi] Задержка в WinSock между send() и recv()
Возникла проблемка, которую я решил, но решение думаю не совсем верное.
Конструкция указанная в примере работала нормально, до тех пор пока на запрос не возвращалось коротких ответов. Но когда ответ приходит небольшой (например, 400 Bad Request, где одни хидеры), то возникает косяк. Заключает он в том, что ответ не успевает приняться и следующий ответ от сервера включает в себя два(!) ответа. В ответе идут хидеры 400 бед реквеста и 200 ок вместе. Это не позволяет нормально анализировать принятые данные. Код Код:
function fWSWrite(hInput: string):string;Код:
function fWSWrite(hInput: string):string;В MSDN ничего о задержки при отправке/приеме не увидел. Подскажите, пожалуйста, верное решение? UPD: Нашел вариант по лучше (через select): Код:
function fWSWrite(hInput: string):string; |
Так это дело даже не в сети. потому что в винде идет полюбому буферизация и если неуспел считать то уже будут склеиваться данные.
Вообще всё зависит от реализации сервера. Типичные сервера первым пакетом шлют хидер а вторым данные. А нетепичные сервера - шлют сразу всё вместе или хидер разбивают. по этому когда шлеш данные то вписывай поле Connection: Close Как тока сделал send то в цикле гоняй recv пока будут идти данные. Как только он вернул <=0 то выходи из цикла. Также желательно замутить таймаут на recv чтобы небыло подвисаний на сверхглючных серваках (вернее самописном вебсервере где он не разрывает соединение потому что не воспринимает Connection: Close) |
Про Connection: Close не знал. Спасибо.
Просто я делал эти запросы через браузер, и он этого не вписывал. Тогда код получается такой (без таймаута)? Код:
function fWSWrite(hInput: string):string;Буду рад примерам из собственных реализаций:) |
наоборот строки поставь
Код:
while (true) do |
Не получается.
Сейчас все запросы сразу посылаются. При снифе идет сразу четыре запроса GET. Ответ только на первом. Вот пример отправляемого запроса: Код:
GET url HTTP/1.1 |
вообще покажи полностью исходник.
Судя по тому что ты показывал у тебя дискриптор сокета - глобальная переменная. Вот он и затирается скорее всего. |
Цитата:
А сокет действительно глобальная переменная :) |
советую глянуть исходнки моего httpsender'a там всё нормально работало.
И там уже есть готовая функция для отправки и получения данных |
Цитата:
|
HTTP Sender архив битый. Перезалей плиз.
Кстати, при приеме данных, максимальное число принятых данных cntread не превышает 2048. Т.е. текст обрезается. Код:
while (true) doКод:
function fWSWrite(hInput: string):string;P.S. Среда Turbo Delphi Lite (Portable) |
| Время: 22:06 |