TServerSocket多线程,关闭客户端连接,程序为什么异常?

wpk 2007-12-06 03:00:38
以下程序我是按照BCB帮助中关于TServerClientThread类写的一段程序

__fastcall TSTServerClientThread::TSTServerClientThread(bool CreateSuspended, TServerClientWinSocket* ASocket,int ATimeOutMSec, TForm *pFrm)
: TServerClientThread(CreateSuspended,ASocket)

{
memset(ReceiveBuff, 0, sizeof(ReceiveBuff)); // initialize the buffer
iPos = 0;
m_pFrm = pFrm;
}
//---------------------------------------------------------------------------

void __fastcall TSTServerClientThread::ClientExecute()
{
TWinSocketStream *pStream;
// make sure connection is active
while (!Terminated && ClientSocket->Connected)
{
try
{
pStream = new TWinSocketStream(ClientSocket, 30000);
try
{
// give the client 60 seconds to start writing
if (pStream->WaitForData(3000))
{
iRead = pStream->Read(ReceiveBuff+, 512);// if can抰 read in 60 seconds
}
else
{
ClientSocket->Close(); // if client doesn抰 start, close
}
}
__finally
{

delete pStream;
}//程序执行到这里就异常了,弹出调试窗口
}
catch (Exception &E)
{
HandleException();
}
}
}

调用线程的时候语句
void __fastcall TForm1::ServerSocketGetThread(TObject *Sender,
TServerClientWinSocket *ClientSocket,
TServerClientThread *&SocketThread)
{
m_pServerSocket = new TSTServerClientThread(false, ClientSocket, 3000, this);
}

问题出当客户连接后(不发送数据的),程序自动进入了ClientExecute()函数,内部函数都处理正常,就是离开这个函数时候,系统异常,出现程序调试窗口,我想知道这是怎么回事,程序已经很简单了,几乎没有加自己的内容,这是为什么那?
...全文
294 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fbCstrike 2008-11-14
  • 打赏
  • 举报
回复
BCB好像有自己的一个异常处理吧,我也正在看这个问题。自己写的错误处理没用。
yanbo_313 2008-06-14
  • 打赏
  • 举报
回复
HandleException();就是这行惹的祸,你把这行注释掉就不会报错了,这行代码的作用就是弹出异常!当你在没有断开连接的情况下,退出程序或者对方主动断开连接pStream->WaitForData(3000)) 或者pStream->Read(ReceiveBuff+, 512)就会抛出异常,而你的CATCH就是抓住异常后,执行HandleException();弹出异常的。HandleException();是CB默认的异常弹出函数。
ydlchina 2007-12-10
  • 打赏
  • 举报
回复
iRead = pStream-> Read(ReceiveBuff+, 512); // ? +
fieldisme 2007-12-10
  • 打赏
  • 举报
回复
是不是在创建pStream的时候,参数为ClientSocket,在释放的时候,应该也要释放ClientSocket内的Socket
因为没有数据传来,执行了ClientSocket-> Close();对应的Socket已释放,故在delete pStream时
free了空指针,把ClientSocket-> Close(); 去掉试试
wpk 2007-12-06
  • 打赏
  • 举报
回复
程序没有进到这个异常处理中,异常是线程退出以后报出来的??
i_love_pc 2007-12-06
  • 打赏
  • 举报
回复
有没有异常信息输出一下看是什么原因?
                catch   (Exception   &E) 
{
//HandleException();
ShowMessage(E.Message);
}

1,317

社区成员

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

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