紧急求助socket通信过程中的缓冲覆盖问题---分全给了,拜托!!!(10分)

  • 主题发起人 主题发起人 terrace
  • 开始时间 开始时间
T

terrace

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了基于TCP/IP下socket通信的客户端,服务器端发包速度非常快(一条记录为一包,一次发一包,通常我所收到的返回包为几千个,即几千条记录),但我又无法控制服务器也不能要求它放慢速度,只能在我这接收方来想办法处理,且包是以结构的形式发的,即不全是字符,可能会在结构中包含integer型,这样就无法用ReceiveText来接收,只能用ReceiveBuf函数(通信方式是非阻塞的),我在处理的过程中发现有坏包,很可能是速度太快而发生了数据覆盖。该怎么对付这种情况呢?
另外,socket的缓冲区大小是多少呢?在哪里设置?最大可设为多少?
 
设置WinSocket缓冲区大小:
var
bs: integer;
begin
bs := 50000 * 1024;
setsockopt(SocketHandle, SOL_SOCKET, SO_SNDBUF, PChar(@bs), sizeof(bs)); //发送方
setsockopt(SocketHandle, SOL_SOCKET, SO_RCVBUF, PChar(@bs), sizeof(bs)); //接收方
end;
你把缓冲区设为零试试看,这样系统一有数据就会发出去,不过这样会增加网络的负担。
 
ego朋友:
我用的是Delphi 5下的ClientSocket和ServerSocket,据说其默认缓冲大小是4k,你用bs := 50000 * 1024;来把缓冲设置为近50M,这样能成功吗?另外,如果想要自己开辟一块内存空间来存放收到的数据包,最大可以分配多少呢?
 
解决方法
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2140583
顺便帮提

速度大概1秒200k的样子
 
是粘包了还是什么
 
to 楼主:
偶没试过,所以...... ^_^

不过我在测试时用for做循环send(没有任何延时),不管是文件还是数据包,只要网络环境良好就不会丢包。
 
接受答案了.
 
后退
顶部