delphi, winsock - иероглифы в конце ответа

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

  1. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16
    Slesh, привет. Делаю консольно winsock winapi проложение, которое посылает web-сереверу get запрос и получает вывод и выводит его функцей Write(), но каждый раз при получение ответа попадаются иероглифы в конце ответа вот

    [​IMG]

    код

    PHP:
    ...
      
    Buffer,b2: array[0..4096of Char;
      
    Headerstring;  
    ....
    if 
    connect(ClientSocketDestAddrSizeOf(DestAddr)) <> INVALID_SOCKET then
      begin
         Header 
    := 'GET /script.php HTTP/1.1'+#13#10+
                    
    'Host: localhost'+#13#10+
                    
    'User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5'+#13#10+
                    
    'Accept: text/html'+#13#10+
                    
    'Connection: close'+#13#10#13#10;
          
    lstrcpy(b2PCHar(header));
         
    send(ClientSocketb2Length(b2), 0);
         
    recv(ClientSocketBufferSizeOf(Buffer), 0);
         
    Write(Buffer);
         
    readln;
      
    end;
     
  2. _nic

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

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    мдаааа. Читай данные в бесконечном цикле, пока recv не вернет 0.И выводи через MessageBoxA ,тогда точно иероглифов небудет)
     
  3. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16
    причём тут recv? и циклы?

    MessageBox тоже вывел иероглиф
     
  4. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    при том, что размера буфера может и не хватить для полученных данных, во-вторых надо наверное знать сколь данных ты прочитал из сокета, и писать только полученные, а не тупо весь буфер, потому как фиг знает что там будет, то ли нолики, а то ли мусор всякий
     
  5. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну дык когда получаешь данные, автоматом последний символ делай равным 0x00
    т.е.
    цикл чтения
    len := recv(***);
    if len > 0 then
    begin
    buf[len] := #0;
    end;

    Потому что array[0..***] of Char; это аналог Ansi строки. А они заканчиваются символом с кодом 0.
     
  6. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    Sc0rpi0n выучи Си тогда все эти вопросы пропадут
     
    #6 greki_hoy, 14 Nov 2010
    Last edited: 14 Nov 2010
  7. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    1. Buffer : array of AnsiChar;
    2. Бесконечный цикл чтение как было сказанно выше.

    Вообще один хороший человек мне как то говорил, что читать нужно байты те самые волшебные [Buffer : array of Byte], а потом переводить в текст и радоваться :)

    P.S. Должно вернуть нормальный текст. В AnsiChar.
     
  8. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16
    спс всем