Socket写失败的解决方案(帮顶有分)(50分)

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

clayjj

Unregistered / Unconfirmed
GUEST, unregistred user!
原先Socket数据流量小时,TClientSocket.Socket.Sendbuf(Buf, BufLength)不会出现什么问题,但是现在数据流量大了,出现了写失败的情况,返回的值出现-1和0两种情况。
为了防止写失败,我使用以下语句解决了写失败的情况。

while True do
begin
if FClientSocket.Socket.SendBuf(Buf, BufLength) = BufLength then Break;
Sleep(1);
end;

但是总觉得有问题,各位有什么好方法么?
 
路过
帮顶
 
感谢......
 
这样不好。会出现异常,你应该一次发送一定的字节,然后循环,直到全部发送完毕。有点类似QQ的传输文件。
 
回楼上的,请问是否存在这样的函数,在每次sendbuf之后调用一下,保证下次写入是安全的?
 
应该检测返回值
如果是缓冲区满了
应该等一段时间
然后再次发送
 
iTotal := Length(SendBuf)
while iTotal > 0 then begin
if iTotal > MaxBuffLen then
iSendLen:= FClientSocket.Socket.SendBuf(Buf, MaxBuffLen)
else
iSendLen := FClientSocket.Socket.SendBuf(Buf, iTotal)
iTotal := iTotal - iSendLen;
end;
其中MaxBuffLen是你自己定义的长度,一般可以为4096,每次发4K。
 
回楼上的,我的包很小的,没个都在200个Byte左右,所以应该不是包太大需要分包发送的原因,但我的系统包虽然小,但是包的量很大,怀疑是Socket上次还没写完,又开始掉用了。
 
那就每次发送后sleep(30),防止粘连包。
 
每次sleep(30),效率不是很低么?
 
不懂,帮顶一下!
 
>>每次sleep(30),效率不是很低么?
只能这样,你想想发内容出去也要时间啊,不然会和上一个包连在一起发,会造成.....自己想吧..........
 
路过帮顶
 
我没用过,只能帮顶了
 
感觉这个控件不好用,为什么不直接用Socket
 
后退
顶部