-
Господа Мастера. пишу типа TCPClient на WinSock в блокирующем режиме. Казуз в том, как поймать дисконект, когда сервер разрывает соединение? send и recv ошибок не выявляет почемуто. Я еще не совсем до конца понимаю работу winsock да и вообще работу протокола tcp знаю поверхосно.
Буду рад любой подсказке. Спасибо.
PS idTCPClient из семейства INDY конечно хороший компонент, но мне по некторым причинам нужен свой.
-
> send и recv ошибок не выявляет почемуто
send не вызывает ?! да быть того не может)
Вот recv - да, она может и не вернуть ошибку, если клиент выполнял этот блокирующий вызов в ожидании данных от партнера, и партнер в это время разорвал соединение по своей инициативе. В этой ситуации recv вернет данные нулевой длины, что и следует трактовать как разрыв петли соединения. Во всех прочих случаях recv как и send обязана вернуть соотв.отказ.
> мне по некторым причинам нужен свой
Так ведь на Инди свет клином не сошелся .. Например, сторонняя библ-ка Synapse при прочих равных условиях - отличная альтернатива Indy.
-
> Например, сторонняя библ-ка Synapse при прочих равных условиях - отличная альтернатива Indy.
Хм.. поищем
Следующий вопрос выходит за рамки топика, мне наверно следует создать новую ветку.
Вобщем сделал я свой комонент на winsock, но это проблему не решило. почему на поп.сервер по команде лист НомМсг, приходит один размер сообщения, а в реальности размер другой указан размер 730 приходит 717, указан размер 58884 приходит 59624, я ничо не могу понять, пробовал idTCPClient тоже самое.
Я в тупике.
-
На основании чего ты сделал умозаключение о несовпадении размера ? Иллюстрируй в коде с комментариями ..
-
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.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; memo1.Lines.Add(s); 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))); memo1.Lines.Add('Message:');
memo1.Lines.Add(buf);
tcp.Socket.Write('QUIT'+#13#10); tcp.Disconnect;
end;
-
И так с любым POP3-сервером ?
-
Да, сейчас проверил на яндексе в ответ на лист 5 он прислал +OK 5 1538 действительный размер на этот раз больше 1612 вот такой пирог
-
> RGV © (12.10.10 10:52) [2]
Читаем скрижали http://www.rfc-editor.org/rfc/rfc1939.txtA 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] > Возможно да, на сколько я понимаю, здесь говорится > о том, что количество октетов на сервере может отличаться > от количества октетов в реале??
Здесь говорится, что локальный размер сообщения на сервере может отличаться от размера сообщения, приведённого к формату стандарта RFC822. И это надо принимать во внимание.
К сожалению, в разделе далее не говорится, как и кто ДОЛЖЕН принимать это во внимание. Там дальше говорится, что, "For example", сервер может посчитать концы строк и скорректировать размер. А может и не скорректировать, например.
> А есть способ както вычислить?
Телепатором. Проще считать, что это багофича, и "принимать это во внимание".
-
Спасибо за ликбез. Будем принимать это во внимание )
-
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
-
|