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

パケット損失はありません。パケットはまだ受信されていません。必要な、または期待するすべてのデータを取得していない場合は、もう一度 receive を呼び出してください。TCP のようなプロトコル (あなたが使用しているものだと思います) には、「バイトをつなぎ合わせる」方法がなく、アプリケーションレベルのメッセージを提供することもできません。そうしたい場合は、それを行うためのコードを作成する必要があります。

receive が要求したバイト数よりも少ない値を返さない場合、期待する正確なバイト数を知らなければ、使用することはほとんど不可能です。それはかなりひどいでしょう。

予想されるバイト数が正確にわかっている場合、そのバイト数を受け取るまで receive 関数を呼び出し続けます。それはあなたの状況のように聞こえるので、指定されたバイト数が蓄積されるまで低レベルの受信関数を呼び出し続ける独自の受信関数を作成してください。(これは最善の方法ではありませんが、うまくいきます。)

于 2013-09-08T00:37:29.723 に答える