如何使用WinRT StreamSockets接收数据包上传确认?

jok*_*efe 5 c# sockets tcp windows-8 windows-runtime

我有一个WinRT应用程序,使用StreamSocket和执行上传DataWriter.它跟踪上传所用的时间,然后计算吞吐量.

我遇到的问题是我的吞吐量比Wireshark显示的要高得多.这是因为我的上传循环在WinRT框架实际将数据发送到网络层之前完成并获取结束时间戳.我发现没有办法从框架接收数据包实际上已经进入网络层的确认.该DataWriter StoreAsync方法只返回您存储的字节数,这是我在存储之前所知道的.

其他框架(如Windows Phone)会在发送数据包后触发回调,并告诉您已上载了多少字节.我没有在WinRT中找到任何等价物,并且必须解决一个记录我在StoreAsync函数中提交了多少字节的循环.

有没有办法从框架中确认何时以及实际发送到网络层的字节数是多少?

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

我仍然在寻找这个问题的解决方案.

编辑:我与微软就此问题创建了一张支持票.他们的官方回应是,在WinRT框架中无法确认数据包是否已实际上传.

pol*_*ran 2

我没有尝试过,但您可以将处理程序分配给对象方法返回的Completed回调属性。DataWriterStoreOperationStoreAsyncDataWritter

或者

您可以直接使用返回操作的属性中WriteAsync的方法。OutputStreamStreamSocketIAsyncOperationWithProgress