посылаю вот так void __fastcall TForm2::Button3Click(TObject *Sender) { UnicodeString httpheader,httpheader1,httpheader2,httpheader3,httpheader4; 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 в мемо получаю китайские эроглифы почему?
Попробуй сделать прием как тут: cyberforum.ru/cpp-builder/thread31583.html должно получится, вообще погугли на эту тему
поменял на 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)); } теперь не доконца получает пример запрос на яндекс
У меня всё целиком приходит Code: 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()); }
а как ты хотел? чтобы всегда сразу все приходило? такого не будет вызывай еще раз 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; тоже самое не до конца.
RunDMX, нет под рукой билдера...какой выбран режим блокируемые или не блокируемые сокеты? Само собой. Возможно неверные заголовки и сервер раньше времени разрывает соединение
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 скрине
Даже если сервер закрывает соединение после отправки данных, все они будут находится в системном буфере на твоей машине. Твоя задача правильно и полностью их отуда достать в свой буфер.
RunDMX, в таком случае я бы посоветовал использовать блокируемые сокеты и в отдельном потоке загружать данные. А вообще если используешь такой уровень(сокета, а уже не готовый HTTP компонент), то я бы взял бы более низкие движки, могу скинуть свой, но на делфи и придётся портировать или если есть знание API сокетов то написать самому, для твоей задачи на чистом API можно написать всё одной процедурой и она будет строк в 80(если не нужно автомат. редиректы, обработки HTTP ошибок и т.д.)
На самом деле бывает такое что сервер закрывает соединение и при этом не всё отправляет, бывает редко, но тем не менее. Тут я такого не вижу, трабла в коде
Jingo Bo я не против взглинуть на твой движок, в дельфях неплохо разбираюсь скинь если возможно я просто взял вчера в дельфи 7 написал все тожесамое с готовым компонентом и все нормалдьно работает а в биледере не хочет видимо все таки нужно WinApi пользовать из за глючных компонентов
В архиве мой движок, фтчи : без VCL(только API модули), возможность пакетной передачи(не на уровне TCP, а чуть выше, тоесть передал 64 кб - принял 64 кб(склеивает пакеты TCP как надо). Так же в архиве пример того что тебе надо, вводишь URL, получаешь данные. http://slil.ru/28655598
Кстати как вариант, можешь там кое что дописать и в dll засунуть, а в билдере использовать. Если портировать не охото.