PDA

Просмотр полной версии : ClientSocket http


RunDMX
13.02.2010, 14:51
посылаю вот так


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/)

почему?

wolmer
13.02.2010, 15:23
поправил в первом посте там видно
Попробуй сделать прием как тут:
cyberforum.ru/cpp-builder/thread31583.html

должно получится, вообще погугли на эту тему

sn0w
13.02.2010, 15:30
вот поэтому и не люблю я rad среды) порой они просто рогами в воздух упираются)

RunDMX
13.02.2010, 15:34
поменял на

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/)

RunDMX
14.02.2010, 13:11
Подниму наверно тему так как перерыл весь инет и решения не нашел
Данные приходят частично

Kaimi
14.02.2010, 13:53
У меня всё целиком приходит

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 передаются? Может я просто не знаю..

RunDMX
14.02.2010, 20:35
а как ты хотел? чтобы всегда сразу все приходило? такого не будет
вызывай еще раз 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 не должен вызываться несколько раз ?

Само собой.

Возможно неверные заголовки и сервер раньше времени разрывает соединение

RunDMX
15.02.2010, 04:20
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
Даже если сервер закрывает соединение после отправки данных, все они будут находится в системном буфере на твоей машине. Твоя задача правильно и полностью их отуда достать в свой буфер.
На самом деле бывает такое что сервер закрывает соединение и при этом не всё отправляет, бывает редко, но тем не менее. Тут я такого не вижу, трабла в коде

RunDMX
15.02.2010, 15:50
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 засунуть, а в билдере использовать. Если портировать не охото.

RunDMX
16.02.2010, 02:05
примного благодарен