ClientSocket http

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by RunDMX, 13 Feb 2010.

  1. RunDMX

    RunDMX New Member

    Joined:
    14 Jun 2009
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    посылаю вот так


    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

    в мемо получаю китайские эроглифы

    [​IMG]

    почему?
     
    #1 RunDMX, 13 Feb 2010
    Last edited: 13 Feb 2010
  2. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Попробуй сделать прием как тут:
    cyberforum.ru/cpp-builder/thread31583.html

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

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,300
    Reputations:
    327
    вот поэтому и не люблю я rad среды) порой они просто рогами в воздух упираются)
     
  4. RunDMX

    RunDMX New Member

    Joined:
    14 Jun 2009
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    поменял на

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

    }

    теперь не доконца получает
    пример запрос на яндекс

    [​IMG]
     
  5. RunDMX

    RunDMX New Member

    Joined:
    14 Jun 2009
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    Подниму наверно тему так как перерыл весь инет и решения не нашел
    Данные приходят частично
     
  6. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    У меня всё целиком приходит
    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());
    }
    
     
    _________________________
  7. Protorus

    Protorus New Member

    Joined:
    17 Jan 2010
    Messages:
    22
    Likes Received:
    0
    Reputations:
    0
    а как ты хотел? чтобы всегда сразу все приходило? такого не будет
    вызывай еще раз ReceiveBuf(Buf,iBufSize)
    (да и еще, больше iBufSize, за раз не примешь)
    Да и еще момент, разве запросы/ответы в unicode передаются? Может я просто не знаю..
     
    #7 Protorus, 14 Feb 2010
    Last edited: 14 Feb 2010
  8. RunDMX

    RunDMX New Member

    Joined:
    14 Jun 2009
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    Так разве 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;

    тоже самое не до конца.
     
    #8 RunDMX, 14 Feb 2010
    Last edited: 14 Feb 2010
  9. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    RunDMX, нет под рукой билдера...какой выбран режим блокируемые или не блокируемые сокеты?
    Само собой.

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

    RunDMX New Member

    Joined:
    14 Jun 2009
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    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 скрине
     
  11. Protorus

    Protorus New Member

    Joined:
    17 Jan 2010
    Messages:
    22
    Likes Received:
    0
    Reputations:
    0
    Даже если сервер закрывает соединение после отправки данных, все они будут находится в системном буфере на твоей машине. Твоя задача правильно и полностью их отуда достать в свой буфер.
     
  12. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    RunDMX, в таком случае я бы посоветовал использовать блокируемые сокеты и в отдельном потоке загружать данные. А вообще если используешь такой уровень(сокета, а уже не готовый HTTP компонент), то я бы взял бы более низкие движки, могу скинуть свой, но на делфи и придётся портировать или если есть знание API сокетов то написать самому, для твоей задачи на чистом API можно написать всё одной процедурой и она будет строк в 80(если не нужно автомат. редиректы, обработки HTTP ошибок и т.д.)
     
  13. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    На самом деле бывает такое что сервер закрывает соединение и при этом не всё отправляет, бывает редко, но тем не менее. Тут я такого не вижу, трабла в коде
     
  14. RunDMX

    RunDMX New Member

    Joined:
    14 Jun 2009
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    Jingo Bo я не против взглинуть на твой движок, в дельфях неплохо разбираюсь
    скинь если возможно

    я просто взял вчера в дельфи 7 написал все тожесамое с готовым компонентом и все нормалдьно работает а в биледере не хочет

    видимо все таки нужно WinApi пользовать из за глючных компонентов
     
    #14 RunDMX, 15 Feb 2010
    Last edited: 15 Feb 2010
  15. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Погодь нгемного, щас тебе напишу
     
  16. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    В архиве мой движок, фтчи : без VCL(только API модули), возможность пакетной передачи(не на уровне TCP, а чуть выше, тоесть передал 64 кб - принял 64 кб(склеивает пакеты TCP как надо).
    Так же в архиве пример того что тебе надо, вводишь URL, получаешь данные.

    http://slil.ru/28655598
     
  17. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Кстати как вариант, можешь там кое что дописать и в dll засунуть, а в билдере использовать. Если портировать не охото.
     
  18. RunDMX

    RunDMX New Member

    Joined:
    14 Jun 2009
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    примного благодарен