2016-11-16 36 views
0

我將數據作爲字符串通過UDP傳輸到虛幻引擎內的Socket類中。這是線程化的,並在後臺運行。C++流udp數據到隊列?

我讀功能是:

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); 

} 

我然後調用從另一大類translate變量,在Tick,或定時器。

我的測試用例從另一個應用程序發送遞增號碼。

如果我從上面的Read函數中打印這個數字,它看起來像預期的那樣,遞增計數。 當我從另一個線程打印它時,它缺少一些數字。

我相信這是因爲我在Tick上調用它,所以它由於處理時間而錯過了一些數據。

我的問題是:

是否有排隊的輸入數據的方式,所以,當我拉的價值,它是一個增量值,而不是當前的一個?什麼是最好的方式去做這件事?

謝謝,請讓我知道如果我不清楚。

+0

你還沒有清楚。您在評論中否定了您在問題中明確發佈的「while」循環的存在。 – EJP

+0

啊,我很抱歉,我在深夜創建了這個問題,並粘貼了錯誤的代碼塊。我已經更新到應該在那裏的'if'循環。 – anti

回答

1

這是完整的代碼? ReceivedData在從套接字填充數據後不使用。相反,正在使用(在此代碼中)未定義的變量'buffer'。

此外,似乎while循環可能會運行多次,覆蓋ReceivedData緩衝區中的舊數據。添加一些調試消息以查看RecvFrom是否實際從套接字讀取所有字節。我相信它只能讀取一個'數據包'。

最後,尤其是當您在網絡上使用UDP套接字時,請注意UDP協議不能保證實際傳送其數據包。但是,如果您在單臺計算機或本地網絡上使用它,我懷疑這會導致您的問題。

+0

嗨,謝謝你的回答,我很抱歉,我的問題有一個錯字,'buffer'應該是'ReceivedData'。 – anti

0

您的閱讀循環沒有意義。您正在讀取並丟棄所有數據報,但是同時發生在套接字接收緩衝區中的任何給定序列中的最後一個數據報。翻譯調用應位於循環內部,循環應該是while(true)while (running)或類似的。

+0

嗨,如上所述,這個函數在'Tick'或者定時器上被調用。因此,沒有while循環。 – anti

+0

@anti在您發佈的代碼中有'while'循環。我無法評論我沒見過的代碼,但我正在準確評論你發佈的內容。 – EJP