关于Socket中对方非常退出的处理问题

edmond98 2003-11-13 11:40:17
如果Client非正常退出,怎么关闭连接,释放资源?

我在
ServerSocket中的OnClientError()事件中加入

ServerSocket->Socket->Connections[0]->Close();

但是关闭后程序仍然不断的报错(OnClientError事件仍然不断地被触发),
而且用Close()方法关闭Client后,读取的ServerSocket1->ActiveConnection>0

这是什么原因呢?

对于这种对方非正常退出的情况,应该做怎样的异常处理呢?
...全文
97 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanreid 2003-11-13
  • 打赏
  • 举报
回复
对方退出有可能是程序主动断开引起的,也可能是网络问题引起的。我的做法是TCP通信,服务器必须设置发送超时,否则容易引起服务端Timeout中改线程挂起引起的缓冲池溢出。异常事件中主动进行断开操作。UDP方式只考虑定期同步机制问题。

释放资源可以在连接断开事件中处理,不但要断开,如果是线程阻塞方式,还要释放你的线程,释放线程池中的对象。不能只在Error事件中处理。
netsys2 2003-11-13
  • 打赏
  • 举报
回复
这样处理:

//---------------------------------------------------------------------------
void __fastcall TFrmMain::ServerClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
Socket->Close();
ErrorCode = 0;
}
叶子哟 2003-11-13
  • 打赏
  • 举报
回复
AfxMessageBox(NULL,"Error","Socket Error",MB_OK);
阻塞了程序执行,不要用这个
一楼处理就行了
edmond98 2003-11-13
  • 打赏
  • 举报
回复
我说的主要是针对由于网络原因,或者Client不正常关机导致的连接中断,TCP连接
我用的ServerSocket的处理方式,是NonBlocking,所以应该不存在释放线程的问题吧?

我现在的处理办法,就是在Error事件中,用Close()方法关闭相应的连接

//---------------------------------------------------------------------------
void __fastcall TFrmMain::ServerClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
AfxMessageBox(NULL,"Error","Socket Error",MB_OK);
Socket->Close();
ErrorCode = 0;
}

但是这样处理完后,仍然不断的出错,Error事件仍然被触发,我觉得好像是没有
完全关闭理解的原因,到底应该怎么处理呢?

edmond98 2003-11-13
  • 打赏
  • 举报
回复
我已经添加了ErrorCode=0,但是Error事件仍然被触发,不知道原因

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧