Delphi IdTcpServer崩溃

Delphi IdTcpServer崩溃,delphi,indy,tcpserver,Delphi,Indy,Tcpserver,我正在使用indy的tcp服务器/客户端,一切正常(修复了一些bug),但有一个bug困扰着我 当我冻结所有线程,然后终止tcp客户端的进程时,服务器崩溃,并在tcpserver中不断引发该错误^nonstop 是否有办法处理Delphi 6中的错误和其他套接字错误并防止服务器崩溃(我使用的是Delphi 6/windows 8 64位(可能不需要,但我从未在win 7上测试过它…)/indy 9/indy TCP服务器和客户端)?您的服务器没有崩溃EIdSocketError是TIdTCPSe

我正在使用indy的tcp服务器/客户端,一切正常(修复了一些bug),但有一个bug困扰着我

当我冻结所有线程,然后终止tcp客户端的进程时,服务器崩溃,并在tcpserver中不断引发该错误^nonstop


是否有办法处理Delphi 6中的错误和其他套接字错误并防止服务器崩溃(我使用的是Delphi 6/windows 8 64位(可能不需要,但我从未在win 7上测试过它…)/indy 9/indy TCP服务器和客户端)?

您的服务器没有崩溃
EIdSocketError
TIdTCPServer
在客户端连接关闭/丢失时遇到的一个非常正常的异常。这是正常的行为
TIdTCPserver
将在内部为您处理该异常,如果异常逃逸到服务器中,则关闭套接字(您应该允许它这样做-如果您自己捕获它,请在处理完后重新引发它)。您看到异常的唯一原因是调试器在您的应用程序看到它之前报告它。只需按F9键让调试器将其传递给应用程序进行正常处理,或者将调试器配置为忽略基于Indy的异常。

您的服务器没有崩溃
EIdSocketError
TIdTCPServer
在客户端连接关闭/丢失时遇到的一个非常正常的异常。这是正常的行为
TIdTCPserver
将在内部为您处理该异常,如果异常逃逸到服务器中,则关闭套接字(您应该允许它这样做-如果您自己捕获它,请在处理完后重新引发它)。您看到异常的唯一原因是调试器在您的应用程序看到它之前报告它。只需按F9键让调试器将其传递给应用程序进行正常处理,或者将调试器配置为忽略基于Indy的异常。

,请确保使用的Indy版本比D7中安装的版本更新(需要先删除旧版本)。存在崩溃线程错误<9.0.18

,请确保您使用的Indy版本比D7中安装的版本更新(您需要先删除旧版本)。有崩溃的线程错误<9.0.18

您在
TIdTCPClient
/
TIdTCPServer
中修复了哪些“错误”?只有一个错误与此相关(我想),我忘了调用TThreadList.UnlockList,它导致客户端仍然连接到服务器,但服务器从未将它们添加到线程列表中。什么“错误”你在
TIdTCPClient
/
TIdTCPServer
中修复了吗?只有一个错误与此相关(我想),我忘记调用TThreadList.UnlockList,它导致客户端仍然连接到服务器,但服务器从未将它们添加到线程列表中。如果我有误导,很抱歉,我的意思是,当我按F9键时,它会一次又一次地引发相同的异常。在异常发生后,您是否仍在尝试写入连接?。比截图更好的是问题中的相关代码。您知道代码的哪一行引发异常(如果有)吗?
ledata:=AThread.Connection.ReadLn(“”,10)
客户端:=PClient(AThread.Data);啊,nvm,这可能只是伪装器中的某个bug或其他什么(它只会偶尔崩溃一次,这样我就不会太在意了)。@user0:如果您正在捕获但没有重新引发Indy异常,您所描述的情况通常会发生,因此,服务器不知道连接已断开,而您的代码最终会一次又一次地访问同一个死连接。看看你的截图,你实际上是在这么做。您需要完全摆脱
try/except
块,或者至少重新引发捕获的任何
EIdException
派生异常。您还需要取消对
AThread.Terminated
AThread.Connection.Connected
的检查。他们不属于那里。让异常告诉您套接字状态。很抱歉,如果我误导了您,我的意思是,当我按F9时,它会一次又一次地引发相同的异常。您是否仍在尝试在异常后写入连接?。比截图更好的是问题中的相关代码。您知道代码的哪一行引发异常(如果有)吗?
ledata:=AThread.Connection.ReadLn(“”,10)
客户端:=PClient(AThread.Data);啊,nvm,这可能只是伪装器中的某个bug或其他什么(它只会偶尔崩溃一次,这样我就不会太在意了)。@user0:如果您正在捕获但没有重新引发Indy异常,您所描述的情况通常会发生,因此,服务器不知道连接已断开,而您的代码最终会一次又一次地访问同一个死连接。看看你的截图,你实际上是在这么做。您需要完全摆脱
try/except
块,或者至少重新引发捕获的任何
EIdException
派生异常。您还需要取消对
AThread.Terminated
AThread.Connection.Connected
的检查。他们不属于那里。让异常告诉您套接字状态。我现在使用纯Winsock,我计划再也不必使用Indy。因此没有必要。我现在使用纯Winsock,我计划再也不必使用Indy。因此没有必要。