???Socket中的Sendbuf问题???(40分)

  • 主题发起人 主题发起人 powersite
  • 开始时间 开始时间
P

powersite

Unregistered / Unconfirmed
GUEST, unregistred user!
遇到一个问题:
Socket发送数据,用NonBlock方式,发送数据,
代码如下:
procedure TBase_Trans.SendData(AStr: String); //发送数据
var
BlockSize: Integer;
P: Integer;
TotalSize: Integer;
SendSize: Integer;
Head: string;
ms: TMemoryStream;
begin
TotalSize := Length(AStr);
Head := format('$$$$$%0.10d$$$$$',[TotalSize]); //先发一个前缀,告诉对方需接收多少字节
SendSize := FSocket.SendBuf(Head[1],20);
ms:=TMemoryStream.Create;
ms.Write(AStr[1],TotalSize);
try
ms.Seek(0,soFromBeginning);
P := 0;
repeat //分块发送数据包
if TotalSize-P>BufferSize then
BlockSize := BufferSize
else
BlockSize := TotalSize-P;
ms.Read(SendBuffer,BlockSize);
repeat
SendSize := FSocket.SendBuf(SendBuffer,BlockSize); //缓冲区内的数据有可能不能一次性递交,须判断
Sleep(50);
until SendSize<>-1; //一直到发送完成才发送下面一部分
P := P+SendSize;
until BlockSize<BufferSize;
finally
ms.Free;
end;
end;
发现发送到一定程度后,经常会在调用SendBuf时,返回值为-1,说明数据队列已满,不能再被递交,好久也不行,此时Socket是仍旧正常连接的,不知是什么原因?
感激涕零!
不好意思,只有40分了,望大侠帮忙啊,
 
发送缓存添满是有可能的,发送的过快就塞满了.
不过你说过好久也不行,可能问题会出在接受端,如果接受端没有及时将数据读出,那么接收缓存满了后tcp会通知发送端新的窗口大小(此时已经为0了),发送端也就什么都发不了了.
 
谢谢LeeChange的关注,
但是,
接受端的OnRead刚开始是多次被触发,
但久了以后,
发送端的数据递交(发送)不了,
此时,
接收端的OnRead也一直没有响应,
后来,
我把发送的BufferSize设置成为1024*100(刚开始是1024*8),
又似乎好了,
一直正常。
真是奇怪,
感觉上,
设置的小一点,
无非是多发几次而已,
应该无碍啊,
请大侠继续关注,
谢谢!
 
后退
顶部