[Delphi-winsock] recv

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kandi, 7 Oct 2010.

  1. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Не могу понять в чем трабла... только начал изучать:

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, winsock, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      wData : WSAData;
      s : TSOCKET;
      addr : sockaddr_in;
      sendbuff, recvbuff : array [0..5000] of Char;
    begin
      WSAStartup($101,wData);
    
      s := socket(AF_INET, SOCK_STREAM, 0);
    
      addr.sin_family:=AF_Inet;
      addr.sin_port:=htons(80);
      addr.sin_addr.S_addr:=inet_addr('87.240.188.251');
      {коннектимся}
      Connect(S, addr, SizeOf(TSockAddr));
    
      sendbuff := 'GET / HTTP/1.1'+ #13#10 +
                  'Host: 87.240.188.251'+ #13#10 +
                  'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FDM)'+ #13#10 +
                  'Accept: text/html'+ #13#10 +
                  'Accept-Charset: windows-1251'+ #13#10 +
                  'Connection: close'+#13#10+
                  #13#10;
    
      {шлем запрос}
      send(s, sendbuff, Length(sendbuff), 0);
      {считываем ответ}
      recv(s, recvbuff, Length(recvbuff), 0);
      { выводим }
      Memo1.Lines.Add(recvbuff);
      { закрываемся }
      WSACleanup;
      closesocket(s);
    end;
    
    end.
    
    
    Возвращает баян какой то :(
    Так и должно быть? :confused:

    [​IMG]

    P.S. поисковал на форуме на тему "recv" ничего подобного не нашёл.... :(
     
    #1 Kandi, 7 Oct 2010
    Last edited: 7 Oct 2010
  2. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    GET /index.php HTTP/1.1
     
    #2 Redeemer, 7 Oct 2010
    Last edited: 7 Oct 2010
  3. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    recv(s, recvbuff, Length(recvbuff), 0);

    и с каких это порт размер буфера вычисляется как блина строки? т.е. буфер и там ничего нет то и размер нулевой. sizeof юзай.
    Если для посылки данных - всё норм считаешь, скока данных запихнул такой длинны и строка, то для получения размера буфера будет 0 в таком случае.


    И проверять что вернула connect и recv
     
  4. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Вообщето в recv передается не размер данных, а емкость буфера. То есть если в буфер можно поместить 5000 байт (которые автором ошибочно названы чарами), то и передается 5000. Так что все верно
     
  5. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Code:
      sendbuff := 'GET /index.php HTTP/1.1'+ #13#10 +
                  'Host: 87.240.188.251'+ #13#10 +
                  'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FDM)'+ #13#10 +
                  'Accept: text/html'+ #13#10 +
                  'Accept-Charset: windows-1251'+ #13#10 +
                  'Connection: close'+#13#10+
                  #13#10;
    
      {шлем запрос}
      send(s, sendbuff, Length(sendbuff), 0);
      {считываем ответ}
      recv(s, recvbuff, SizeOf(recvbuff), 0);
      { выводим }
      Memo1.Lines.Add(recvbuff);
    тоже самое! :(
     
  6. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Попробуй в host записать vkontakte.ru
    И самое главное чего ты не делаешь - очистку буферов:
    FillChar(sendbuf[0], 5001, 0); перед записью в него данных
    FillChar(recvbuf[0], 5001, 0); перед получением данных
     
    #6 Redeemer, 8 Oct 2010
    Last edited: 8 Oct 2010
  7. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Возможно ли через что нить посмотреть что я отсылаю и что мне присылают?! HTTPAnalyzer не берёт :D

    только что попробовал... не прёт :(
     
  8. Chrome~

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

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    SizeOf как раз и возвращает "емкость" буфера.
    Правильно не
    Code:
    send(s, sendbuff, Length(sendbuff), 0);
    а
    Code:
    send(s, sendbuff[0], SizeOf(sendbuff), 0);
    не
    Code:
    recv(s, recvbuff, SizeOf(recvbuff), 0);
    а
    Code:
    recv(s, recvbuff[0], SizeOf(recvbuff), 0);
     
    #8 Chrome~, 8 Oct 2010
    Last edited: 8 Oct 2010
  9. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Chrome~, Length тоже вернет "емкость" буфера. Можете проверить.
    recvbuff[0] - это просмотрел. Действительно.
    Kandi, обновил свой предыдущий пост.

    Ну и еще по-хорошему надо не весь буфер отсылать, а только по размеру данных.
     
  10. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Всё именно так и сделал..ответ к сожалению еироглифный(((( что творить народ? может кодировка какая то? (((
     
  11. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Кстати, может быть. У тебя же 2010 дельфи, а она тока юникодные строки понимает


    Пы.Сы. Итог таков. Хотя указанные нами ошибки и имеют место быть и должны быть исправлены. НО!!! Код приведенный автором абсолютно рабочий, тока что проверил.

    Автору - либо меняй дельфи на 2007, либо перекодируй все строки в ANSI и обратно. 2010 дельфи работает только с юникодом.
     
    #11 Redeemer, 8 Oct 2010
    Last edited: 8 Oct 2010
  12. Chrome~

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

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Выложи сюда полный проект.
     
  13. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Да у меня 2010. и что мне делать? :О

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, winsock, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      wData : WSAData;
      s : TSOCKET;
      addr : sockaddr_in;
      sendbuff, recvbuff : array [0..5000] of Char;
    begin
      WSAStartup($101,wData);
    
      s := socket(AF_INET, SOCK_STREAM, 0);
    
      addr.sin_family:=AF_Inet;
      addr.sin_port:=htons(80);
      addr.sin_addr.S_addr:=inet_addr('87.240.188.251');
      {коннектимся}
      Connect(S, addr, SizeOf(TSockAddr));
    
      sendbuff := 'GET /index.php HTTP/1.1'+ #13#10 +
                  'Host: vkontakte.ru'+ #13#10 +
                  'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FDM)'+ #13#10 +
                  'Accept: text/html'+ #13#10 +
                  'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'+ #13#10 +
                  'Accept-Charset: windows-1251'+ #13#10 +
                  'Connection: close'+#13#10 +
                  #13#10;
    
      {шлем запрос}
      FillChar(sendbuff, 5001, 0);
      send(s, sendbuff[0], SizeOf(sendbuff), 0);
      {считываем ответ}
      FillChar(recvbuff, 5001, 0);
      recv(s, recvbuff[0], SizeOf(recvbuff), 0);
      { выводим }
      Memo1.Lines.Add(recvbuff);
      { закрываемся }
      WSACleanup;
      closesocket(s);
    end;
    
    end.
    
     
  14. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Пы.Сы. Итог таков. Хотя указанные нами ошибки и имеют место быть и должны быть исправлены. НО!!! Код приведенный автором абсолютно рабочий, тока что проверил.

    Автору - либо меняй дельфи на 2007, либо перекодируй все строки в ANSI и обратно. 2010 дельфи работает только с юникодом.
     
  15. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Окей.


    Всем большое спасибо. Особенно G-Host :D

    Code:
    sendbuff, recvbuff : array [0..5000] of AnsiChar;
    AnsiChar помог)

    Всё заработало :)
     
  16. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    чего-чего? см. выше пост ТС
     
  17. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Неправильно выразился. По-умолчанию с юникодом, что в случае ТС и имело место быть
     
  18. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Так принимается =)
     
  19. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Спасибо, сэнсэй;)