• RGV © (12.10.10 09:13) [0]
    Господа Мастера.
    пишу типа TCPClient на WinSock в блокирующем режиме. Казуз в том, как поймать дисконект, когда сервер разрывает соединение? send и recv ошибок не выявляет почемуто. Я еще не совсем до конца понимаю работу winsock да и вообще  работу протокола tcp знаю поверхосно.

    Буду рад любой подсказке.
    Спасибо.

    PS idTCPClient из семейства INDY конечно хороший компонент, но мне по некторым причинам нужен свой.
  • Сергей М. © (12.10.10 10:08) [1]

    > send и recv ошибок не выявляет почемуто


    send не вызывает ?! да быть того не может)

    Вот recv - да, она может и не вернуть ошибку, если клиент выполнял этот блокирующий вызов в ожидании данных от партнера, и партнер в это время разорвал соединение по своей инициативе. В этой ситуации recv вернет данные нулевой длины, что и следует трактовать как разрыв петли соединения. Во всех прочих случаях recv как и send обязана вернуть соотв.отказ.


    > мне по некторым причинам нужен свой


    Так ведь на Инди свет клином не сошелся ..
    Например, сторонняя библ-ка Synapse при прочих равных условиях - отличная альтернатива Indy.
  • RGV © (12.10.10 10:52) [2]

    > Например, сторонняя библ-ка Synapse при прочих равных условиях  - отличная альтернатива Indy.


    Хм.. поищем

    Следующий вопрос выходит за рамки топика, мне наверно следует создать новую ветку.

    Вобщем сделал я свой комонент на winsock, но это проблему не решило.
    почему на поп.сервер по команде лист НомМсг, приходит один размер сообщения, а в реальности размер другой указан размер 730 приходит 717, указан размер 58884 приходит 59624, я ничо не могу понять, пробовал idTCPClient тоже самое.

    Я в тупике.
  • Сергей М. © (12.10.10 11:08) [3]
    На основании чего ты сделал умозаключение о несовпадении размера ?
    Иллюстрируй в коде с комментариями ..
  • RGV © (12.10.10 12:27) [4]

    procedure TForm1.Button1Click(Sender: TObject);

     function NotOk(const s:string):boolean;   //проверка ответа сервера
     begin
       result:=copy(s,1,4)='-ERR';
       if result then
       begin
         tcp.Disconnect;
          memo1.Lines.Add(s);
       end;
     end;

     Function SendCmd(cmd:string; var response:string):boolean;    //отсылаем команду , ждем ответ
     var
       witherr:boolean;
     begin
       result:=false;
       witherr:=false;
       try
         tcp.Socket.Write(cmd+#13#10);
       except
         on e:Exception do
         begin
           tcp.Disconnect;
           memo1.Lines.Add(e.Message);
           witherr:=true;
         end;
       end;
       if not withErr then
       begin
         try
           response:=tcp.Socket.ReadLn;
         except
           on e:Exception do
           begin
             tcp.Disconnect;
             memo1.Lines.Add(e.Message);
             witherr:=true;
           end;
         end;
         result:= not NotOk(response) ;
       end;
     end;

    var
     s:string;
     buf:string;
    begin
     //Данный код написан для примера
     //tcp : TidTCPClient (indy 10)
     tcp.Host:='pop.mail.ru';
     tcp.Port:=110;
     tcp.Connect;
     if not tcp.Connected then
     begin
       memo1.Lines.Add('Not connected');
       exit;
     end else
     begin
       memo1.Lines.Add('Connected.');
       application.ProcessMessages;//проявитель
     end;
     if NotOk(tcp.Socket.ReadLn) then exit; //ждем когда сервер поприветствует
     if not SendCmd('USER Login',s) then exit;
     if not SendCmd('PASS Passw',s) then exit;
     memo1.Lines.Add('Login OK');
     application.ProcessMessages; //проявитель
     if not SendCmd('LIST 52',s) then exit; //Узнаю размер сообщения под номером 52
     memo1.Lines.Add(s); //сервер вернул +OK 52 950 в дальнейшем из этой строки я извлекаю размер
     Application.ProcessMessages;//проявитель
     if not SendCmd('RETR 52',s) then exit; //команда на получение сообщение
     s:='';
     buf:='';
     repeat
       s:=tcp.Socket.ReadLn;
       buf:=buf+s+#13#10;
     until s='.';  //точкой обозначается конец сообщения
     memo1.Lines.Add('Real size = '+inttostr(Length(buf))); // length(buf) = 930  меньше чем 950
     memo1.Lines.Add('Message:');
     memo1.Lines.Add(buf);
     tcp.Socket.Write('QUIT'+#13#10); //прощаемся;
     tcp.Disconnect;//не дожидаясь ответа

    end;

  • Сергей М. © (12.10.10 12:43) [5]
    И так с любым POP3-сервером ?
  • RGV © (12.10.10 12:48) [6]
    Да, сейчас проверил на яндексе
    в ответ на лист 5 он прислал +OK 5 1538
    действительный размер на этот раз больше 1612
    вот такой пирог
  • DiamondShark © (12.10.10 12:48) [7]

    > RGV ©   (12.10.10 10:52) [2]

    Читаем скрижали http://www.rfc-editor.org/rfc/rfc1939.txt

    A scan listing consists of the message-number of the message, followed by a single space and the exact size of the message in octets.  Methods for calculating the exact size of the message are described in the "Message Format" section below.

    <...>

    11. Message Format

      All messages transmitted during a POP3 session are assumed to conform
      to the standard for the format of Internet text messages [RFC822].

      It is important to note that the octet count for a message on the
      server host may differ from the octet count assigned to that message
      due to local conventions for designating end-of-line.


    Переводить?
  • RGV © (12.10.10 12:56) [8]

    > Переводить?


    Возможно да, на сколько я понимаю, здесь говорится о том, что количество октетов на сервере может отличаться от количества октетов в реале??

    А есть способ както вычислить?
  • DiamondShark © (12.10.10 13:11) [9]

    > RGV ©   (12.10.10 12:56) [8]
    > Возможно да, на сколько я понимаю, здесь говорится
    > о том, что количество октетов на сервере может отличаться
    > от количества октетов в реале??

    Здесь говорится, что локальный размер сообщения на сервере может отличаться от размера сообщения, приведённого к формату стандарта RFC822. И это надо принимать во внимание.

    К сожалению, в разделе далее не говорится, как и кто ДОЛЖЕН принимать это во внимание. Там дальше говорится, что, "For example", сервер может посчитать концы строк и скорректировать размер.
    А может и не скорректировать, например.


    > А есть способ както вычислить?

    Телепатором.
    Проще считать, что это багофича, и "принимать это во внимание".
  • RGV © (12.10.10 13:37) [10]
    Спасибо за ликбез. Будем принимать это во внимание )
  • Johne441 (12.05.17 19:27) [11]
    I simply couldn't depart your site prior to suggesting that I actually loved the standard info an individual supply for your guests? Is going to be back regularly in order to inspect new posts. kgckgdeffeae
  • Pharmb915 (13.05.17 13:19) [12]
    Hello! sildenafil generic india http://via3indian.com/#4.html
Есть новые Нет новых   [118624   +10][b:0][p:0.002]