Просмотр полной версии : ClientSocket http
посылаю вот так
void __fastcall TForm2::Button3Click(TObject *Sender)
{
UnicodeString httpheader,httpheader1,httpheader2,httpheader3,htt pheader4;
httpheader1="GET / HTTP/1.0 \r\nAccept: */* \r\n";
httpheader2="Connection: Keep-alive \r\n";
httpheader3="Host: rustorrents.org \r\n";
httpheader4="User-Agent: MyAgent \r\n\r\n";
httpheader= httpheader1+httpheader2+httpheader3+httpheader4;
ClientSocket1->Socket->SendText(httpheader);
Memo1->Lines->Add(httpheader);
}
принимаю вот так
void __fastcall TForm2::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
UnicodeString answer ;
Memo1->Lines->Add("Получаем данные");
answer=ClientSocket1->Socket->ReceiveText();
Memo1->Lines->Add(answer) ;
}
компилятор с++ builder 2009
в мемо получаю китайские эроглифы
http://jpegshare.net/images/cb/89/cb893bc16438a5c1e560081d4945ff7b.jpg (http://jpegshare.net/)
почему?
поправил в первом посте там видно
Попробуй сделать прием как тут:
cyberforum.ru/cpp-builder/thread31583.html
должно получится, вообще погугли на эту тему
вот поэтому и не люблю я rad среды) порой они просто рогами в воздух упираются)
поменял на
void __fastcall TForm2::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
int iBufSize = Socket->ReceiveLength();
char *Buf = new char [iBufSize + 1];
Socket->ReceiveBuf(Buf,iBufSize);
AnsiString Rtext=Buf;
Memo1->Lines->Add(UTF8Decode(Rtext));
}
теперь не доконца получает
пример запрос на яндекс
http://jpegshare.net/images/e7/83/e783889ef48f1a12c094624288b4ee5e.png (http://jpegshare.net/)
Подниму наверно тему так как перерыл весь инет и решения не нашел
Данные приходят частично
У меня всё целиком приходит
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ClientSocket1->Socket->SendText("GET / HTTP/1.1\r\nHost: rustorrents.org\r\n\r\n");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add(ClientSocket1->Socket->ReceiveText());
}
Protorus
14.02.2010, 14:38
а как ты хотел? чтобы всегда сразу все приходило? такого не будет
вызывай еще раз ReceiveBuf(Buf,iBufSize)
(да и еще, больше iBufSize, за раз не примешь)
Да и еще момент, разве запросы/ответы в unicode передаются? Может я просто не знаю..
а как ты хотел? чтобы всегда сразу все приходило? такого не будет
вызывай еще раз ReceiveBuf(Buf,iBufSize)
(да и еще, больше iBufSize, за раз не примешь)
Да и еще момент, разве запросы/ответы в unicode передаются? Может я просто не знаю..
Так разве ClientSocket1Read не должен вызываться несколько раз ?
поставил вот так:
int iBufSize = Socket->ReceiveLength();
while(iBufSize>0){
char *Buf = new char [iBufSize + 1];
Socket->ReceiveBuf(Buf,iBufSize);
AnsiString Rtext=Buf;
//Memo1->Lines->Add(UTF8Decode(Rtext));
Application->ProcessMessages();
Memo1->Lines->Add(Rtext); }
iBufSize=0;
тоже самое не до конца.
Jingo Bo
15.02.2010, 03:23
RunDMX, нет под рукой билдера...какой выбран режим блокируемые или не блокируемые сокеты?
Так разве ClientSocket1Read не должен вызываться несколько раз ?
Само собой.
Возможно неверные заголовки и сервер раньше времени разрывает соединение
ctNonBlocking
ответ от сервера
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Mon, 15 Feb 2010 00:18:56 GMT
Content-Type: text/html; charset=windows-1251
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny4
Vary: Accept-Encoding
дальше идет Html и обрываеться гдето в середине и дальше отключение происходит
как видно на 2 скрине
Protorus
15.02.2010, 13:23
дальше идет Html и обрываеться гдето в середине и дальше отключение происходит
Даже если сервер закрывает соединение после отправки данных, все они будут находится в системном буфере на твоей машине. Твоя задача правильно и полностью их отуда достать в свой буфер.
Jingo Bo
15.02.2010, 14:53
RunDMX, в таком случае я бы посоветовал использовать блокируемые сокеты и в отдельном потоке загружать данные. А вообще если используешь такой уровень(сокета, а уже не готовый HTTP компонент), то я бы взял бы более низкие движки, могу скинуть свой, но на делфи и придётся портировать или если есть знание API сокетов то написать самому, для твоей задачи на чистом API можно написать всё одной процедурой и она будет строк в 80(если не нужно автомат. редиректы, обработки HTTP ошибок и т.д.)
Jingo Bo
15.02.2010, 14:54
Даже если сервер закрывает соединение после отправки данных, все они будут находится в системном буфере на твоей машине. Твоя задача правильно и полностью их отуда достать в свой буфер.
На самом деле бывает такое что сервер закрывает соединение и при этом не всё отправляет, бывает редко, но тем не менее. Тут я такого не вижу, трабла в коде
Jingo Bo я не против взглинуть на твой движок, в дельфях неплохо разбираюсь
скинь если возможно
я просто взял вчера в дельфи 7 написал все тожесамое с готовым компонентом и все нормалдьно работает а в биледере не хочет
видимо все таки нужно WinApi пользовать из за глючных компонентов
Jingo Bo
16.02.2010, 00:39
Погодь нгемного, щас тебе напишу
Jingo Bo
16.02.2010, 01:36
В архиве мой движок, фтчи : без VCL(только API модули), возможность пакетной передачи(не на уровне TCP, а чуть выше, тоесть передал 64 кб - принял 64 кб(склеивает пакеты TCP как надо).
Так же в архиве пример того что тебе надо, вводишь URL, получаешь данные.
http://slil.ru/28655598
Jingo Bo
16.02.2010, 01:50
Кстати как вариант, можешь там кое что дописать и в dll засунуть, а в билдере использовать. Если портировать не охото.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot