当我从目标收到数据时,E.G。:
function TSlave.RecvInteger:integer;
var
p:pointer;
len, i, sent:integer;
begin
result := -1;
len := 4;
p := @result;
sent := 0;
repeat
Sleep(10);
i := Recv(Sk, p^, len, 0);
if i <= 0 then begin
Result := -1;
break;
end;
inc(sent, i);
dec(len, i);
p :=ptr(integer(@result) + sent);
until len = 0;
end;
我必须这样做只是为了得到一个完美的结果,为什么在你打电话给recv时有时会丢包?
答案 0 :(得分:6)
没有数据包丢失,数据包尚未收到。如果您还没有获得所需的所有数据,请再次致电接收。像TCP这样的协议(我假设你正在使用它)没有办法“将字节粘在一起”,也没有提供应用程序级别的消息。如果你想这样做,你需要编写代码来完成它。
如果接收从未返回少于您要求的字节数,那么如果您不确切地知道您期望的字节数,则几乎不可能使用。那太可怕了。
如果您 确切地知道您期望的字节数,请继续调用接收函数,直到您收到这么多字节为止。这听起来像你的情况,所以只需编写自己的接收函数,继续调用低级接收函数,直到它累积了指定的字节数。 (这不是最好的方法,但这样可行。)