1

私はこれに似たコードを持っています(非常に単純化されています):

char *data, *ack;
...
while (<not done>) {
    sendData(data+offset);
    receiveACK(ack);
// <<<What I want to do>>>
//  if (ack == <bad> || <receiveACK() TIMEOUT>)
//      continue;
//
    ... 
    offset += SPACING;
}

問題は、sendData() と receiveACK() が、私が使用しなければならないブラック ボックスをブロックしていることです。

私が望むのは、特定の時間枠内に ACK を受信できなかった場合に、同じ入力で sendData() を再度トリガーすることだけです。どうすればいいですか?

注: スレッドはオプションではありません。

編集: sendData() と receiveACK() の背景のビット。彼らはネットワーク通信を行います。sendData() はデータを送信しようとし、機能しない場合は失敗します (ここでは問題ありません)。問題は、反対側では、シーケンスとチェックサムが正しい場合にのみ ACK が送信されることです。つまり、データ エラー => ACK なし。これで receiveACK() はトラフィックを待って解釈します。トラフィックがない場合 (ACK がない場合)、必要に応じて永遠に待機し続けます...そのため、タイムアウトを構築しようとしています。

4

2 に答える 2

2

これらの関数がブラック ボックスでない場合は、receiveAck でチェックしているソケットで select または poll を使用して、必要なタイムアウトを設定します。ACK が間に合った場合は、次のパケットに移動します。タイムアウトした場合は、再送信してください。

それらが真のブラックボックスである場合、あなたはめちゃくちゃです。ライブラリからより多くの機能が必要になります。Linuxボックスを使用している場合は、EINTRで読み取りを強制的に失敗させるために何かできるかもしれません。ただし、投票の選択は正しい解決策です。

于 2013-04-14T17:32:29.163 に答える