简体   繁体   中英

Indy server TIdTCPServer.OnExecute called continuously after client disconnect

I have situation when I know how much bytes I expect to get from client (in this code it is 100). If client does't gives me 100 I don't need this packet at all, because it is corrupted.

I have situation when client gives less than 100 bytes and disconnects. In this case I'm catching exception and everything would be fine except that after this exception my ServerTCPExecute is called for many times uncontinuously. There are no any other clients connected. Why it is so? If I do TIdYarnOfThread(AContext.Yarn).Thread.Terminate; everything goes fine. But I'm not sure it is good solution.

procedure Form1.ServerTCPExecute(AContext: TIdContext);
begin
  try
    AContext.Connection.IOHandler.ReadBytes(b, 100, False);
  except
    //TIdYarnOfThread(AContext.Yarn).Thread.Terminate;
  end;
end;

Solution: do not use try ... except to catch and ignore all exceptions within OnExecute .

This will swallow the Indy exception which happens when the client disconnects, the server will execute the next iteration of OnExecute if the IOHandler.InputBuffer still has data in it, and ReadBytes raises another exception because the peer disconnected.

If any exception is raised and leaves the method, the Indy TCP server will close and clean up the connection.

Indy uses exceptions for error handling and notifications in OnExecute , so do not suppress them with an "empty" exception handler. If you need to catch exceptions, re-raise any EIdException -derived exceptions you catch and let the server handle them.

ps: the posted code seems to use a non-local variable b . Because TIdTCPServer is a multi-threaded component, non-local variables must always be accessed in a thread-safe way, for example using a critical section, or putting the variable inside of the TIdContext object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM