tidtcpserver接受数据问题不完整!
我用C++ Builder 2007做一个服务端、客户端通信的程序,如果Client端数据没有回车键时,server端接受的数据没有什么问题,但是文件内容有好几行就有问题,而且要支持多个Client端发送,我使用的是TIDTCPServer和TIDTCPClient控件,TCPServer的相关代码如下:
void __fastcall TServer::LogServerExecute(TIdContext *AContext)
{int i,Len;
char Filename[17]="";
AnsiString S;
TIdIOHandler *IOH = AContext->Connection->IOHandler;
try{
S=IOH->ReadLn();
}
catch (Exception &exception)
{
Memo->Lines->Add("Error");
}
Len=S.Length();
if(Len>0)
{for(i=0;i<16;i++)
Filename[i]=S.c_str()[i]; //接受数据的前16个字符为文件名,后面为文件内容
Filename[i]='\0';
Memo->Lines->Add(Filename);
SaveFile(S,Filename); //将接受到的文件内容保存到SERVER的一个文件
AContext->Connection->IOHandler->WriteLn(Filename);
}
}
请问这应该怎么解决?谢谢!
[解决办法]
最好把回车符去掉
[解决办法]
用readbuffer吧。
先通过readfromstack读取本次读得长度。
[解决办法]
刚才打开bcb2007.他包含了 Indy10.1.5。
还真没找到我用的那两个函数。
我用的是bcb6,Indy9.0.18。
你试试别的函数。
因为readln是读取,以某个特定值作为结尾的一串,好像是回车。
如果你要读取文件,可能就不适合了。
你试试 alldate之类的。
[解决办法]
使用换行符作为协议边界分隔符对于传输多行文本信息的业务本身就是不合理的.
其实Indy当中那个Write(TStream...,true)/ReadLongWord+ReadStream(...)就是一个很好的TCP传输协议.
Write的最后一个参数是AWriteByteCount为true就表示先写入四个字节(如果设置LargeStream为true则为八个字节)表示实际数据长度,然后再写入数据.
接收的时候可以先ReadLongWord(如果设置LargeStream为true则为ReadInt64)取得数据的长度,然后再调用ReadStream取得即可.