Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
[Delphi] Задержка в WinSock между send() и recv() |

29.09.2009, 04:22
|
|
Участник форума
Регистрация: 20.04.2007
Сообщений: 174
Провел на форуме: 2310282
Репутация:
149
|
|
[Delphi] Задержка в WinSock между send() и recv()
Возникла проблемка, которую я решил, но решение думаю не совсем верное.
Конструкция указанная в примере работала нормально,
до тех пор пока на запрос не возвращалось коротких ответов.
Но когда ответ приходит небольшой (например, 400 Bad Request, где одни хидеры), то возникает косяк.
Заключает он в том, что ответ не успевает приняться и следующий ответ от сервера включает в себя два(!) ответа.
В ответе идут хидеры 400 бед реквеста и 200 ок вместе.
Это не позволяет нормально анализировать принятые данные.
Код
Код:
function fWSWrite(hInput: string):string;
var
hOutput: array[0..5000] of char;
begin
Send(hSocket, hInput[1], length(hInput), 0);
FillChar(hOutput, SizeOf(hOutput), 0);
Recv(hSocket, hOutput, 5000, 0);
result := hOutput;
end;
Решение нашел такое:
Код:
function fWSWrite(hInput: string):string;
var
hOutput: array[0..5000] of char;
begin
Send(hSocket, hInput[1], length(hInput), 0);
sleep(1000);
FillChar(hOutput, SizeOf(hOutput), 0);
Recv(hSocket, hOutput, 5000, 0);
result := hOutput;
end;
Но считаю, что это не совсем корректно.
В MSDN ничего о задержки при отправке/приеме не увидел.
Подскажите, пожалуйста, верное решение?
UPD: Нашел вариант по лучше (через select):
Код:
function fWSWrite(hInput: string):string;
var
hOutput: string;
hArray: array[0..5000] of char;
rdfs: tfdset;
tmout: timeval;
ievnt: integer;
cntread: integer;
begin
cntread := 1;
Send(hSocket, hInput[1], length(hInput), 0);
FillChar(hArray, SizeOf(hArray), 0);
while (cntread > 0) do
begin
FD_ZERO(rdfs);
FD_SET(hSocket, rdfs);
tmout.tv_sec := 0;
tmout.tv_usec := 500000;
ievnt := select(0, @rdfs, nil, nil, @tmout);
if (ievnt <= 0) then break;
cntread := Recv(hSocket, hArray, 5000, 0);
hOutput := hOutput + copy(hArray, 1, cntread);
end;
result := hOutput;
end;
Последний раз редактировалось GlooK; 29.09.2009 в 06:06..
|
|
|
|
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Секретные Коды
|
_-[A.M.D]HiM@S-_ |
Сотовый фрикинг |
98 |
09.06.2010 16:01 |
|
Клиент-сервер на WinSock
|
--StraNger-- |
Авторские статьи |
1 |
21.04.2009 11:43 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|