为什么winsock recv有时会返回少于请求的数据

时间:2013-09-08 00:33:32

标签: delphi winsock

当我从目标收到数据时,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时有时会丢包?

1 个答案:

答案 0 :(得分:6)

没有数据包丢失,数据包尚未收到。如果您还没有获得所需的所有数据,请再次致电接收。像TCP这样的协议(我假设你正在使用它)没有办法“将字节粘在一起”,也没有提供应用程序级别的消息。如果你想这样做,你需要编写代码来完成它。

如果接收从未返回少于您要求的字节数,那么如果您不确切地知道您期望的字节数,则几乎不可能使用。那太可怕了。

如果您 确切地知道您期望的字节数,请继续调用接收函数,直到您收到这么多字节为止。这听起来像你的情况,所以只需编写自己的接收函数,继续调用低级接收函数,直到它累积了指定的字节数。 (这不是最好的方法,但这样可行。)