0

当我从目标接收数据时,EG:

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时有时会出现丢包?

4

1 回答 1

6

没有丢包,只是还没有收到数据包。如果你没有得到你想要或期望的所有数据,只需再次调用接收。TCP 之类的协议(我认为这是您正在使用的协议)无法“将字节粘合在一起”,也无法提供应用程序级消息。如果你想这样做,你需要编写代码来做到这一点。

如果接收返回的字节数永远不会少于您要求的字节数,那么如果您不确切知道您期望的字节数,那么几乎不可能使用它。那将是相当可怕的。

如果您确实知道您需要多少字节,只需继续调用接收函数,直到收到那么多字节。这听起来像你的情况,所以只需编写你自己的接收函数,它会不断调用低级接收函数,直到它累积了指定的字节数。(这不是最好的方法,但会奏效。)

于 2013-09-08T00:37:29.723 回答