2016-11-16 7 views
0

UDP上の文字列として、Unrealエンジン内のSocketクラスにデータをストリーミングしています。これはスレッド化され、バックグラウンドで実行されます。キューにudpデータをストリームするC++?

私の読み取り機能がある:私は、その後Tick、またはタイマーに、別のクラスからtranslate変数を呼び出す

float translate; 
void FdataThread::ReceiveUDP() 
{ 

    uint32 Size; 
    TArray<uint8> ReceivedData; 

    if (ReceiverSocket->HasPendingData(Size)) 
    { 
     int32 Read = 0; 
     ReceivedData.SetNumUninitialized(FMath::Min(Size, 65507u)); 
     ReceiverSocket->RecvFrom(ReceivedData.GetData(), ReceivedData.Num(), Read, *targetAddr); 
    } 

    FString str = FString(bytesRead, UTF8_TO_TCHAR((const UTF8CHAR *)ReceivedData)); 
    translate = FCString::Atof(*str); 

} 

私のテストケースは、別のアプリケーションから増分する数字を送信します。

上記のRead関数の内部からこの数値を印刷すると、インクリメンタルにカウントアップされます。 他のスレッドから印刷すると、いくつかの番号が欠落しています。

私はTick上で呼び出すため、これは処理時間のためにデータが欠落していると考えられます。

私の質問は:私は値を引いたときに、それは次の増分価値ではなく、現在の1になるように

は、入ってくるデータをキューにそこの方法ですか?これについて最善の方法は何ですか?

ありがとうございました。私には明らかにされていない場合はお知らせください。

+0

あなたは明確ではありません。あなたはあなたの質問に明白に投稿した 'while'ループの存在をコメントで否定しています。 – EJP

+0

ああ、私は深夜にこの質問を作成し、間違ったコードブロックを貼り付けたことをお詫びします。私は 'if'ループを更新する必要があります。 – anti

答えて

1

これは完全なコードですか? ReceivedDataはソケットからのデータで満たされた後は使用されません。代わりに、(このコードで)未定義の変数 'buffer'が使用されています。

また、whileループは複数回実行され、ReceivedDataバッファの古いデータを上書きする可能性があります。 RecvFromが実際にソケットからすべてのバイトを読み取るかどうかを確認するデバッグメッセージを追加します。私はそれがただ一つの「パケット」を読むと信じています。

最後に、ネットワーク上でUDPソケットを使用している場合は、UDPプロトコルがパケットを実際に配信することが保証されていないことに注意してください。しかし、これを単一のコンピュータまたはローカルネットワーク上で使用している場合は、この問題が原因であるとは思われません。

+0

こんにちは、あなたの答えをありがとう、私は申し訳ありません、私は私の質問に誤字があった、 'バッファ'は 'ReceivedData'だったはずです。 – anti

0

読み取りループは意味をなさないものです。同じ時刻にソケット受信バッファ内に存在するすべてのデータグラムを読み込んだり、すべてのデータグラムを廃棄したりしています。 translateコールはループの内側にあり、ループはwhile(true)またはwhile (running)、またはそれに類するものでなければなりません。

+0

こんにちは、この関数は、Tickまたはタイマーで呼び出されます。したがって、whileループはありません。 – anti

+0

@anti投稿したコードに「while」ループがあります。見たことのないコードについてはコメントできませんが、あなたが投稿した内容については正確にコメントしています。 – EJP

関連する問題