如何接收数据包上传确认与WinRT StreamSockets

本文关键字:WinRT StreamSockets 确认 何接收 数据包 | 更新日期: 2023-09-27 18:02:27

我有一个使用StreamSocketDataWriter执行上传的WinRT应用程序。它跟踪上传所花费的时间,然后计算吞吐量。

我遇到的问题是,我得到的吞吐量远高于Wireshark显示。这是因为我的上传循环在WinRT框架实际将数据发送到网络层之前完成并接受结束时间戳。我没有找到从框架接收到数据包实际上已经到达网络层的确认的方法。DataWriter StoreAsync方法只返回您存储的字节数,这是我在存储它们之前知道的。

其他框架,如Windows Phone,有一个回调,在你的数据包发送后触发,并告诉你你上传了多少字节。我没有在WinRT中找到任何等效的,并且不得不满足于记录我在StoreAsync函数中提交了多少字节的循环。

是否有一种方法可以从框架中确认何时以及有多少字节实际发送到网络层?

更新:我尝试了@polkduran的建议,虽然它们帮助减轻了一些数据包丢失,但我仍然在较小的文件上传(100KB)中遇到严重的数据包丢失。对于更大的文件(4MB和10MB),所有的数据包都被发送,但是结束时间仍然有几秒的偏差,这大大扭曲了吞吐量计算(与Wireshark跟踪相比)。我猜回调只是减慢了上传的速度,而不是提供实际的数据包上传确认。

我还在寻找解决这个问题的方法。

编辑:关于这个问题,我向微软创建了一个支持单。他们的官方回应是,在WinRT框架中没有办法确认数据包实际上已经上传。

如何接收数据包上传确认与WinRT StreamSockets

我没有尝试过,但您可以在DataWritter对象的StoreAsync方法返回的DataWriterStoreOperation中为Completed回调属性分配处理程序。

你可以直接从StreamSocketOutputStream属性中使用WriteAsync方法,它返回IAsyncOperationWithProgress操作。