使用TClientSocket收到服务器包的大小不一致,请问可能是什么原因?(200分)

  • 主题发起人 主题发起人 HongYuan
  • 开始时间 开始时间
H

HongYuan

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器端是第三方开发的,提供有测试工具,通过测试工具收到的包大小604,814字节,自己使用TClientSocket,ctNonBlocking方式收到的包大小与这个完全不一样真不知道什么原因.

另:想换成Indy控件试,那位可邮我一份资料.
E-Mail:hahong@163.com
 
另问一下,这里的全文检索是不是用不了啦?
 
Service Unavailable
 
因为TCP他会粘包,分包。
这样的话,你必须多接几次,把几个包组成一个包。。。
 
to:天真
非常感谢你的帮助,你说的情况确实和我遇到的相符,不知道你是否有处理的过,我对组包产生恐惧,因为收包不能中断,否则我担心少包,不知道要怎么做才能安全的处理组包,分解,处理?可否提供一个方案,再次谢你能帮助我.
 
发送数据包可以发送字符也可以是二进制流的形式发送.
1:如果是字符串形式的话,可以将收到的包都存于一个string变量中(即string=string+收到的内容),然后,对string去匹配,组合成真正的内容(最好的方式是采用XML的格式).
2:如果是流的形式就要根据你所定义的数据格式来做了.
 
to:qnaqbgss
我是按Array of Byte来收内容的.
 
建立一个缓冲区 既然要组包 你一定知道会在发送实际数据分块前发送整个包的大小 或者包含在第一个分块中。如果包不是很大 直接分配一块内存 并建立一个结构来保存信息
TWaitRecv = record
Data:Pointer;
//数据缓冲区
TotalSize:Integer;
//整个包的大小
Completed:Integer;
//已接收量
end;
每收到一个分块 就根据位移复制到结构的Data域中 并更新Completed域。
如果整个包数据太大 你可以用暂存到文件的方式来解决。说自己用什么array of byte来收的话是弱智的。要搞比较底层点的东西 就要有一切都是指针的思想。
 
while (已经收到的数量<总的数量)do
begin
数量:=recv(.. ...);
已经收到的数量:=已经收到的数量+数量
end;
 
正常情况,TCP是流协议。[:D]
 
后退
顶部