простой пример TClientSocket

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by rudi, 6 Jan 2011.

  1. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    привет
    у меня Builder C++ 6

    подскажите пример кода
    простого соединения например к mail.ru
    и получения в Memo заглавной страницы
    Не могу разобраться

    я делал так и не получилось
    PHP:
          ClientSocket1->Port =80;
          
    ClientSocket1->Host "mail.ru";
          
    ClientSocket1->Open();
          
    ClientSocket1->Socket->SendText("GET / HTTP/1.1");

          
    Memo1->Text ClientSocket1->Socket->ReceiveText();
     
    1 person likes this.
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Посылай текст вида
    PHP:
    GET HTTP/1.1#13#10#13#10
    #13#10#13#10 - это \r\n\r\n. Эти 4 символа нужно посылать в конце GET запроса.
     
  3. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    сделал так
    и все равно в Memo пусто

    PHP:
          ClientSocket1->Port =80
          
    ClientSocket1->Host "94.100.191.201";
          
    ClientSocket1->Open();
          
    ClientSocket1->Socket->SendText("GET / HTTP/1.1#13#10#13#10");

          
    Memo1->Lines->Add(ClientSocket1->Socket->ReceiveText());

     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Нет, ну это неправильно. В Delphi можно отправить так:
    PHP:
    ClientSocket1.Socket.SendText('GET / HTTP/1.1' #13#10#13#10);
    Как в C++ - не знаю точно :( может быть, также.
     
    1 person likes this.
  5. shude

    shude New Member

    Joined:
    15 May 2010
    Messages:
    8
    Likes Received:
    3
    Reputations:
    5
    Гы)

    Для того, чтобы получать данные от TClientSocket , нужно пройти во вкладку Enents и там найти событие OnRead, кликнуть по нему дважды, откроется обоработчик события OnRead. Там пишем например так:
    Memo1->Text = Socket->ReceiveText();

    И каждый раз как только будут приходить данные на сокет, будет срабатывать событие OnRead.


    P.S. TClientSocket ориентирован на события, поэтому ты не сможешь вызвать SendText(); а после ее завершения тут же ждать ответа. Ответ всегда будет принимать событие OnRead();
     
    1 person likes this.
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Code:
    int len;  
    char buff[1024]; 
    len = wsprintf(buff, "GET %s HTTP/1.0\r\n\  
    Host: %s\r\n\  
    User-agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6\r\n\  
    Accept: */*;q=0.9\r\n\  
    Connection: close\r\n\r\n",get,host);
    ClientSocket1->Host = "94.100.191.201"; - не подключайся никогда по IP, используй всегда доменное имя, так как IP может меняться динамически + на виртуальных серверах вся адресация крутится вокруг доменного имени
     
    _________________________
    #6 Gar|k, 9 Jan 2011
    Last edited: 9 Jan 2011
  7. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    А msdn'овцы ссут коннектиться к сервакам по доменному имени, т.к. оно в отличие от ip может быть подменено злоумышленниками :-D
     
  8. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    Спасибо разобрался.
    немного не удобно обрабатывать в событиях. Хотя кому как....
     
  9. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    События - это хорошо. Можно выполнить много всего, и не ждать результата выполненного действия, если он и вообще будет.
    Есть конечно такие понятия как тайм-аут, но это все не то.