关于通讯的时候,TClinetSocket接收数据的问题(怎样断断每次的接受处理的数据收完整了) (50分)

  • 主题发起人 主题发起人 cjsam
  • 开始时间 开始时间
C

cjsam

Unregistered / Unconfirmed
GUEST, unregistred user!
我客户端接受数据部分这样写的:采用的是ctblocking
接受数据放在TThread.execute;overload;中进行,代码主要在下面:
var
sock: TClientSocket;
TheStream: TWinSocketStream;
ReadBuff:array[0 .. 8499] of Char;
receiveframe: string;
begin
.............
while (not Terminated) and (sock.Active) do
begin
try
if TheStream.WaitForData( FTimeout ) then
begin
FillChar(ReadBuff, 8500, 0);
sock.Socket.ReceiveBuf(ReadBuff,sizeof(readbuff));
receiveframe :=copy(readBuff,1,sizeof(readbuff));
..........
//然后用TheStream.Write(。。。。)发送数据和服务器通讯交互。
.......................
end;
except
end;
end;
end;
在一个线程内这样接受服务端的数据,如果我将服务端和我的客户端放一台机器上,接受数据正常,但是当没在一台机器上的时候,收的数据 收不完整。
大家有谁知道这是什么原因吗?
后来发现是因为TCP自动将我的一帧分几次包传给我了,请我我怎样才能断断我收到的这个包数据是服务器
发过来的一个完整的我们之间约定的帧。
 
>>收的数据 收不完整
?????
详细情况。
你收的数据量很大吗?
如果你收的数据量很大,那么对方一定分包了(TCP包),你应该接着收。
 
多收几次就可以了,tcp/ip是不能保证发送的包一次发到接收端的,但能够保证发送和接收是一样。
 
在不同的机器上,收数据的时候,当开始收服务器传诵来的文件,因为文件大,所以服务器上的将文件分解后传下来,但是每一帧应该有帧号+说明+内容,但是我在收的时候,帧号+说明都给丢了,直接来就是文件的内容。
但是在将服务器和客户端放在同一台机器上,同样的程序,收文件是很正常的。
 
来自:chenxz, 时间:2003-7-31 9:02:00, ID:2072573
多收几次就可以了,tcp/ip是不能保证发送的包一次发到接收端的,但能够保证发送和接收是一样。

chenxz:我定义的每个包是 帧号+说明+内容 的,现在有时候就是你说的这种,它将一个文件的内容做几次传过来的,后面传过来的没有帧号和说明了,我的程序只是针对每个带帧号的包做处理,所以收到只是内容的包就有错误,我想问你一下,在我线程里怎样多次收一包的数据呀??程序在我上面说的。谢谢!

 
WinSocket传输数据是分包的,用UDP。或者加标记,判断是否收全。并且也可以用流传输。
 
没办法,现在服务端是人家的,已经做好了,我现在想当与做一个终端,不能改,通讯的格式也不能改,那是GB,现在就只能在我上面的程序里改的话怎样改呀?
 
我自己解决了,不用客气大家了
 
后退
顶部