TServerSocket多线程编程的问题

sztanj 2000-08-16 11:11:00
在TServerSocket中有个通讯类型ServerType属性:如果设置成为stThreadBlocking(阻塞),就要进行多线程编程。要自己创建一个TServerClientThread的子类,并重载ClientExecute函数,在ClientExecute函数里通过TWinSocketStream流主动去读由客户
端发过来的数据并进行处理。

问题是每次由客户端断开连接时,都要产生异常:“Read error 64 指定的网络名不可再用”。好像是这样的:当客户端断开连接时,发消息给服务端后就断开了,服务端接到消息用TWinSocketStream流去读时,却说网络不可用。因此产生ESocketError异常。

请问:这个问题该怎么解决?
...全文
147 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
herbert73 2001-02-18
  • 打赏
  • 举报
回复
关注1
FengSC 2000-08-17
  • 打赏
  • 举报
回复
可以用这个函数 bool __fastcall WaitForData(int Timeout);
在读取数据前先调用这个函数可以知道有没有数据可以接收。Timeout为等待超时时间。
例如:
int __fastcall TformSocket::ReceiveBuf(char *_Buf, int _datalen)
{
int aLen, bLen=0;
TWinSocketStream *pStream;
DWORD beginTick;
char Buf[17];
beginTick=GetTickCount();
while(!CltSocket->Socket->Connected && GetTickCount()-beginTick<200);
if(!CltSocket->Socket->Connected) return -1;
try{
pStream = new TWinSocketStream(CltSocket->Socket, 1000);
try{
if (pStream->WaitForData(OverTime)){
while(pStream->WaitForData(100)){
if((aLen=pStream->Read(Buf, 16))==0){
CltSocket->Socket->Close();
break;
}
memcpy ((&_Buf[bLen]), Buf, aLen);
bLen+=aLen;
if (bLen>=_datalen) break;
}
}
else CltSocket->Socket->Close();
}
__finally{
delete pStream;
}
}
catch(Exception &E){
Application->HandleException(this);
}
return bLen;
}
其中OverTime为等待超时时间。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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