关于网友提出的“ 有关TServerSocket和TClientSocket的问题”问题疑问,本网通过在网上对“ 有关TServerSocket和TClientSocket的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 有关TServerSocket和TClientSocket的问题
描述: 在TServerSokcet中调用SendBuf发送4000的数据包,在TClientSocket的ClientSocketRead事件中用Socket.ReceiveBuf接收数据包,然后用日志记录,在日志中看到发送的记录与接收的记录不一致,会有几个数据包接收不到,我用的是TCP方式,不应该会经常丢失(功能 :从一台电脑读文件到别一台电脑),请高手指教....
解决方案1: bds已经没有这控件了,可能是它自己也觉得不可靠吧
解决方案2: 我也遇到同样的问题,不知道是怎么回事,感觉TClientSocket的ClientSocketRead不怎么可靠
解决方案3: ReceiveBuf并不一定能一次性接收完整的数据。
在调用该函数前,先通过Socket.ReceiveLength获取数据长度,然后检查ReceiveBuf函数的返回值,这个返回值表示该函数实际接收了的数据。如果返回值小于Socket.ReceiveLength获取的数据长度,则需要再次调用ReceiveBuf函数,直至所有数据全部获取。
例如:
procedure TForm1.SocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
iLength : Integer;
iReceived : Integer;
bBuffer : array of Byte;
begin
iLength := Socket.ReceiveLength;
while iLength > 0 do
begin
SetLength (bBuffer, iLength);
iReceived := Socket.ReceiveBuf(bBuffer[0], iLength);
//处理数据
......
iLength := iLength - iReceived;
end;
bBuffer := nil;
end;
以上介绍了“ 有关TServerSocket和TClientSocket的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3671000.html