一个socket问题

hbqgf 2003-07-09 11:38:29
server端用cb6定义的Tserversocket非阻塞模式,客户端为jb7,现在问题是server端能
接受client端数据,在server端用settext发送数据客户端接受非常慢,有时收不到,
如果server端settext后,马上将serversocket的Active改为false,则客户端立即收到数据,请各位大虾诊断诊断,问题所在!另外若客户端异常退出,server端产生100053异常,我如何捕捉!





...全文
56 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingcaiyao 2003-07-10
  • 打赏
  • 举报
回复
你的SendText函数可以贴出来看看吗?
hbqgf 2003-07-10
  • 打赏
  • 举报
回复
我改用SendText()发送一字符串到客户端,问题一样,我又用CB6做了一client端程序,测试
发送与接受均正常,我糊涂!
kingcaiyao 2003-07-10
  • 打赏
  • 举报
回复
首先,ServerSocket控件是对socket api封装,你看看sockcomp.pas源代码就知道了。客户端和服务器端都位于WINDOWS平台,ServerSocket写的服务器当然可以接收JBuilder7客户端发送过来的数据。SetText这个函数应该是你写的吧?其实在将数据回写到客户端时只需要用SendBuf就可以了,即:
void __fastcall OnClientRead(******,....,
{
//Read data coming from client written with JBuilder7.....
.......
//Process the recieved data....
........
//Send to client
Socket->SendBuf(.....);
//..............
}
如果出现你所说的问题,你应该检查一下SetText这个函数。
至于你说Client退出时出现10053错误,这是正常的,因为服务器已断开连接。如果你用过socket api就知道,在非阻塞模式下,当服务器断开连接后,客户端会收到socket dll发送的FD_CLOSE消息。
hbqgf 2003-07-10
  • 打赏
  • 举报
回复
SendText之后,必须将serversocket1的active状态改为false ,客户端才能收到!
hbqgf 2003-07-10
  • 打赏
  • 举报
回复
如下为程序一部分:

void __fastcall TFrmCommListen::ServerSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString nCommand,Msg ;
int n ;
if (seStatus==seWait)
{
Msg=Socket->ReceiveText();
nCommand=Msg.SubString(1,5) ;
if (nCommand=="SFILE")
{seStatus=seRfile ;
rFile=Msg.SubString(6,Msg.Length()-5);
Socket->SendText(nCommand);}
else if (nCommand=="RFILE")
{ seStatus=seSfile ;
rFile=Msg.SubString(6,Msg.Length()-5);
Socket->SendText(nCommand); }
else if ( nCommand=="CCODE")
{
AnsiString swjg ;
int dnph ;
rFile=Msg.SubString(6,Msg.Length()-5);
Memo1->Lines->Add("取号"+rFile) ;
swjg= rFile.SubString(1,8);
if (ADOQueryDNPH->Active) ADOQueryDNPH->Active = false ;
ADOQueryDNPH->Close() ;
ADOQueryDNPH->SQL->Clear();
ADOQueryDNPH->SQL->Text = "select SWJGBM,DNSPH from KP_DNPH where SWJGBM='"+swjg+"'" ;
ADOQueryDNPH->ExecSQL() ;
ADOQueryDNPH->Active = true ;
if (ADOQueryDNPH->RecordCount>0)
{
try
{dnph=ADOQueryDNPH->FieldByName("DNSPH")->AsInteger ;
dnph=dnph+1 ;
ADOQueryDNPH->Edit() ;
ADOQueryDNPH->FieldByName("DNSPH")->AsInteger = dnph ;
ADOQueryDNPH->Post() ;
}
catch (EDatabaseError &e)
{ Socket->SendText("error取号失败");}
Socket->SendText(String(dnph));} &&此语句
else
{ Socket->SendText("error取号失败");}
}
else
seStatus=seWait ;
}
else if (seStatus==seRfile)
{
char Buffer[8192] ;
Memo1->Lines->Add("准备接受文件"+rFile) ;
TMemoryStream *tmpStream = new TMemoryStream() ;
do {
n=Socket->ReceiveBuf(Buffer,sizeof(Buffer));
if (n<=0)
break ;
else
tmpStream->Write(Buffer,n);
Sleep(200);
}while(true) ;
tmpStream->SaveToFile(rFile) ;
delete tmpStream ;
Memo1->Lines->Add("文件接受完毕!");
seStatus=seWait ;
}
else if (seStatus==seSfile)
{
if (FileExists(rFile))
{

TFileStream *fileStream = new TFileStream(rFile,fmOpenRead|fmShareDenyWrite);
Socket->SendStream(fileStream);
fileStream->Free() ;
delete fileStream ;
}
seStatus=seWait ;
}
else if (seStatus==seCode)
{
}
}
pp616 2003-07-10
  • 打赏
  • 举报
回复
settext???这是什么函数啊。

1,317

社区成员

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

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