我将数据作为字符串通过UDP传输到虚幻引擎中的Socket类。这是线程化的,并在后台运行。
我的阅读功能是:
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 :(得分:1)
这是完整的代码吗?在从套接字填充数据后,不使用ReceivedData。相反,正在使用(在此代码中)未定义的变量'buffer'。
此外,似乎while循环可以多次运行,覆盖ReceivedData缓冲区中的旧数据。添加一些调试消息以查看RecvFrom是否实际从套接字读取所有字节。我相信它只能读取一个“数据包”。
最后,特别是当您通过网络使用UDP套接字时,请注意,UDP协议无法保证实际传送其数据包。但是,如果您在一台计算机或本地网络上使用它,我怀疑这会导致您的问题。
答案 1 :(得分:0)
你的阅读循环没有意义。您正在读取并丢弃所有数据报,但同时发生在套接字接收缓冲区中的任何给定序列中的最后一个数据报。 translate调用应位于循环内,循环应为while(true)
,或while (running)
或类似。