2017-08-18 12 views
0

バイトの中に大量のデータを送信しているソケットがありますが、同じ情報を繰り返していることがよくありますが、受信側はこのバイトを一度に取得できませんでした。私は送信側を遅くする方法を持っていましたが、今は十分なバイトが来ていないため、待ち時間があります。私はリアルタイム転送が必要です。UDPソケット最後に受信したバイトを読み取る

レシーバが最後に受信したバイトを読み込み、他のものを破棄してプログラムで追いかける方法はありますか?

while (sock->isConnect() && tcpsock->isConnect()) { 
    // with while instead of if, stuck in the loop 
    if (sock->RecData(buff, 14)) { //receiving 14 bytes from UDP 
     sendAngles2(buff); 
     logger->setLatenz(logger->RECV); 
    } 
    logger->setLatenz(logger->MAIN); 
    logger->LogData(); 
    // rest of the code 
} 
+0

これは専用のスレッドで実行されていますか、または大きなメインループの一部として実行されていますか? – Frank

+0

このループはmain()ループ内にありません – Yann

+0

UDPはブロックプロトコルではないストリームです。あなたはあなたが望むものに到達するために到着するためにすべてのバイトを読みなければなりません。 –

答えて

0

Unfortuntely、このを行うための標準的な/通常の方法がありません - 新しいパケットが完全な受信バッファを持っているUDPソケットの受信されたとき、新たなパケットがドロップされた、でもそれは希望より古い(バッファされた)パケットをドロップするほうが好都合です。

あなたができることは、setsockopt(fd, SOL_SOCKET, SO_RECVBUF, ...を使用してソケット受信バッファのサイズを小さくすることです。これにより、受信者が後退したときにパケットをすぐに破棄し始め、逆効果的にパケット処理の待ち時間が短縮されます(bufferbloat軽減手法)。


私は承知しているそれらのLinuxやBSD上でこれを行う方法はありません。いくつかのリアルタイムOSは

1

それを行う方法は、受信機が最後の入力バイトを読み取り、そのプログラムに追求し、他のものを捨てるという方法がありますがあり?

はい。ソケット非ブロックを設定します。必要な場合は、selectを使用してデータが到着するまで待ってください。

その後、EWOULDBLOCKエラーを返すまでループ内でrecv(またはrecvfrom)を呼び出してください。前の通話から受信したデータを使用します(長さを保存してください)。

+0

MSG_PEEKオプションが> 0を返す 'recv()'の間にループすることができ、ループ内で読み込むことはできますが、もちろんシステムコールを2倍にします。 – EJP

関連する問題