Наконец-то я получил приложение Delphi для отправки данных с использованием прямых сокетов с библиотекой Synapse через HTTPS.
Однако у меня возникли проблемы с определением размера возвращаемых мне данных.
В настоящее время у меня есть следующий код:
Socket := TTCPBlockSocket.Create;
status := TStringList.Create;
status.Append('LineBuffer length: ' + IntToStr(Length(Socket.LineBuffer)));
status.Append('Waiting bytes: ' + IntToStr(Socket.WaitingDataEx));
status.Append('recvBufferStr: ' + CRLF + Socket.RecvBufferStr(240, 25000) );
status.Append('LastError = ' + Socket.LastErrorDesc);
status.Append('Error code: ' + IntToStr(Socket.LastError));
Memo1.Lines.AddStrings(status);
и я получаю следующее в Memo1:
socket lastError = 0
LineBuffer length: 0
Waiting bytes: 0
recvBufferStr:
HTTP/1.1 200 OK
Date: Thu, 22 Dec 2011 01:06:07 GMT
Server: Apache
Content-Length: 237
Connection: close
Content-Type: text/plain; charset=utf-8
[***The returned Data***]
Если первый параметр Socket.RecvBufferStr (длина для получения) слишком велик, я получаю ошибку winsock 10054, потому что я все еще жду данных, даже если сервер завершил их отправку.
Если он слишком короткий, что почти всегда бывает, я получаю только указанный объем данных.
Байты ожидания и длина линейного буфера показывают 0 (не уверен, что это потому, что они longInt, а я делаю IntToStr), поэтому я не думаю, что так я проверяю количество данных. И я также безрезультатно пытался использовать CanRead и CanReadEx.
Я хотел бы сделать что-то вроде следующего: Socket.RecvBufferStr ([длина для получения], [до получения всех данных] или 25000).
Если есть другая функция, это нормально, но я хотел бы придерживаться TTCPBlockSocket поскольку HTTPSend и другие, которые я пробовал из синапса, не работают для моих целей.
Как проверить — используя сокет TTCPBlockSocket из < библиотека href="http://synapse.ararat.cz/doku.php" rel="nofollow">Synapse с Delphi/Pascal — сколько данных мне возвращает сервер?