OS:windows 2003 server
三层架构:客户端程序 + socketConnection + (scksrvr + 服务器应用程序) + SQL Server 2005
由于业务比较简单,我将scksrvr及服务器应该程序集合在一起.现在的问题是,当网络非法断开时报10054错误(远程主机强迫关闭了一个现有的连接 (10054), on API 'recv' ).然后,所有的客户端程序都连接不上全部报10054错误,必须要关闭服务器应用程序再打开才可以重新连接.我分为用了以下四种方法,试图在服务器端捕捉产生10054的异常,均没有成功.-.用TServerSocket.OnClientError
TSocketDispatcher = class(TServerSocket)
OnClientError := MyServerSocketClientError; 二.overload TServerClientThread.HandleError
TSocketDispatcherThread = class(TServerClientThread, ISendDataBlock)
procedure HandleError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);overload;三.捕捉THREAD_EXCEPTION 消息
procedure OnMessage(var Msg: TMsg; var Handled: Boolean);
if msg.message = THREAD_EXCEPTION then begin
Handled := true;
ShowMessage( Exception(msg.lParam).Message);
end;四.用ApplicationEvents捕捉
procedure TSocketForm.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
showmessage('Error Raise ' + e.ClassName);
Raise e;
end;--
现在要解决的问题是,即使客户端异常断开,也可以让其他用户登录,不必重启服务器应用程式,希望高手指教.其实在scksrvr里面非法断开的在60S后会被断开的(RemoveClient),可是客户端就是连不上了.这个异常似乎scksrvr并不会raise,或者说我不知道在哪里产生的.
三层架构:客户端程序 + socketConnection + (scksrvr + 服务器应用程序) + SQL Server 2005
由于业务比较简单,我将scksrvr及服务器应该程序集合在一起.现在的问题是,当网络非法断开时报10054错误(远程主机强迫关闭了一个现有的连接 (10054), on API 'recv' ).然后,所有的客户端程序都连接不上全部报10054错误,必须要关闭服务器应用程序再打开才可以重新连接.我分为用了以下四种方法,试图在服务器端捕捉产生10054的异常,均没有成功.-.用TServerSocket.OnClientError
TSocketDispatcher = class(TServerSocket)
OnClientError := MyServerSocketClientError; 二.overload TServerClientThread.HandleError
TSocketDispatcherThread = class(TServerClientThread, ISendDataBlock)
procedure HandleError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);overload;三.捕捉THREAD_EXCEPTION 消息
procedure OnMessage(var Msg: TMsg; var Handled: Boolean);
if msg.message = THREAD_EXCEPTION then begin
Handled := true;
ShowMessage( Exception(msg.lParam).Message);
end;四.用ApplicationEvents捕捉
procedure TSocketForm.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
showmessage('Error Raise ' + e.ClassName);
Raise e;
end;--
现在要解决的问题是,即使客户端异常断开,也可以让其他用户登录,不必重启服务器应用程式,希望高手指教.其实在scksrvr里面非法断开的在60S后会被断开的(RemoveClient),可是客户端就是连不上了.这个异常似乎scksrvr并不会raise,或者说我不知道在哪里产生的.
这里有一篇介绍scktsrvr源代码的文章,有兴趣的可以看看.