Indy - ReadLnSplit вызывает NotConnected Exception при закрытии - PullRequest
2 голосов
/ 17 марта 2012

Я использую TIdTCPServer и следующий код для чтения ввода клиента:

repeat
    cl3:=cl3+AContext.Connection.IOHandler.ReadLnSplit(WasSplit,#0,-1,-1,TEncoding.UTF8);
    until not WasSplit;

Однако, если клиент подключен к серверу, и я закрываю сервер, он создает класс исключения (EIdNotConnected) с сообщением «Не подключен».
Если я использую ReadLn вместо ReadLnSplit , исключение не возникает.

Что вызывает это исключение и как я могу его предотвратить?

Полагаю, решение простое, но я новичок в сокетах и ​​Indy и не могу понять.

Заранее спасибо.

1 Ответ

3 голосов
/ 21 марта 2012

В чем собственно проблема? Когда вы закрываете сервер, предполагается , чтобы активные операции чтения / записи вызывали исключение. Это нормальное поведение для Инди. ReadLn() с такой же вероятностью вызовет исключение, как и ReadLnSplit(). Indy полагается на исключения для своих внутренних уведомлений. Просто позвольте серверу обработать исключение для вас, чтобы он мог завершить и очистить поток, управляющий TIdContext и его соединением. Исключение составляет контекст этого потока, остальная часть вашего кода (или ваши пользователи) его не увидят.

Единственное, что ReadLnSplit() делает иначе, чем ReadLn(), - это заставляет свойство MaxLineAction IOHandler равным maSplit во время этого вызова, и ничего больше. Единственная причина использования ReadLnSplit() заключается в обработке строк, которые длиннее свойства MaxLineLength IOHandler, без изменения MaxLineLength. Если вам не нравится, как ведет себя ReadLnSplit(), не используйте его. Вы можете просто увеличить значение свойства MaxLineLength IOHandler и вместо этого вызвать ReadLn():

AContext.Connection.IOHandler.MaxLineLength := MaxInt;
cl3 := AContext.Connection.IOHandler.ReadLn(#0, IndyUTF8Encoding);

Или вы можете вызвать перегруженную версию ReadLn() с необязательным параметром AMaxLineLength:

cl3 := AContext.Connection.IOHandler.ReadLn(#0, IdTimeoutDefault, MaxInt, IndyUTF8Encoding);
...