当前位置:主页>销售管理软件> 列表

Socket写失败的解决方案(帮顶有分) 找傻瓜进销存破解版

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

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

但是总觉得有问题,各位有什么好方法么?

2楼: 路过
帮顶 如会计电算化考试软件

3楼: 感谢......

4楼: 这样不好。会出现异常,你应该一次发送一定的字节,然后循环,直到全部发送完毕。有点类似QQ的传输文件。

5楼: 回楼上的,请问是否存在这样的函数,在每次sendbuf之后调用一下,保证下次写入是安全的?

6楼: 应该检测返回值
如果是缓冲区满了
应该等一段时间
然后再次发送

记账软件版7楼: 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。

8楼: 回楼上的,我的包很小的,没个都在200个Byte左右,所以应该不是包太大需要分包发送的原因,但我的系统包虽然小,但是包的量很大,怀疑是Socket上次还没写完,又开始掉用了。

9楼: 那就每次发送后sleep(30),防止粘连包。

10楼: 每次sleep(30),效率不是很低么?

11楼: 路过
我顶

12楼: 顶起! 如操作简单的财务软件

13楼: 不懂,帮顶一下!

记账软件版14楼: >>每次sleep(30),效率不是很低么?
只能这样,你想想发内容出去也要时间啊,不然会和上一个包连在一起发,会造成.....自己想吧..........

15楼: 路过帮顶

16楼: 顶起!

17楼: 顶起!

18楼: 我没用过,只能帮顶了

19楼: 感觉这个控件不好用,为什么不直接用Socket

20楼: 顶起!

记账软件版21楼: 顶起!

22楼: 感谢 如傻瓜进销存破解版

23楼: 接受答案了.