- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Windows Phone 8 应用程序中有以下代码。
//connection code, done during app start
socket = new StreamSocket();
await socket.ConnectAsync(serverHostName, serviceName);
dataReader = new DataReader(socket.InputStream);
dataReader.InputStreamOptions = InputStreamOptions.Partial;
dataWriter = new DataWriter(socket.OutputStream);
建立连接后,我有另一个线程检查传入的网络数据包
await dataReader.LoadAsync(2048);
dataReader.ReadBytes(buffer);
----------
工作流程如下
“工作状态”和“非工作状态”没有场景差异。
所以我尝试调试它。我为 dataReader.LoadAsync 设置了一个断点并看到执行在调用时无限等待。
为确保服务器正确发送数据,我在 Windows 手机模拟器中运行了该应用程序,并在 PC 中运行了 WireShark 网络分析器。我可以看到正在接收电话 IP 地址的数据包。
当套接字中有数据可供读取时,有人知道为什么 dataReader.LoadAsync 函数调用根本不返回吗?
最佳答案
我遇到了同样的问题。这对蓝牙 RFCOMM SPP 串行端口设备尤其不利,因为底层 Rfcomm 对象不提供设置 ReadTimeout 值的功能。编辑:InputStreamOptions.Partial 选项似乎适用于 UWP Win10 平台,但它仅在您已经知道您期望的大量数据时才有用。否则它将无限期地等待最后一次调用。
当我在这些行下方的引用资料中找到使用 CancellationTokenSource 解决问题时,我几乎要放弃了
//connect your Windows.Devices.Bluetooth.Rfcomm.RfcommDeviceService
// see the Bluetooth chat example
[...]
StreamSocket streamSocket = new StreamSocket();
await streamSocket.ConnectAsync(...); //connect to Bluetooth device
DataReader dataReader = new DataReader(inputStream); // to read from the stream
try
{
var timeoutSource = new CancellationTokenSource(1000); // 1000 ms
uint numberBytesToRead = 256;
var data = await dataReader.LoadAsync(numberBytesToRead).AsTask(timeoutSource.Token);
}
catch (TaskCanceledException)
{
// we will get here, and everything looks fine, but the problem is:
// The underlying streamSocket is also closed!
// we can not re-use the streamSocket. Any more calls to LoadAsync results in exceptions (something about the object being not assigned...)
// we need to do a full await streamSocket.ConnectAsync(...) again, but that takes ~3 seconds.
}
所以这个方法只是一个蛮力,最后的超时尝试。
来自@mayu 的方法非常有效(serialDevice.ReadTimeout),但仅适用于类 Windows.Devices.SerialCommunication.Serial Device 的设备,但不Windows.Devices.Bluetooth.Rfcomm.RfcommDeviceService。不知道TCP/IP套接字的情况如何。
简而言之,RFCOMM SPP 蓝牙连接是否有任何可用的超时?或者有什么方法可以提前知道 .LoadAsync(1) 是否会因为没有可用的新数据而阻塞?
MSDN 的这个人有完全相同的问题,但 MS 也不知道答案:https://social.msdn.microsoft.com/Forums/vstudio/en-US/71ea17d4-ca16-43c2-ab43-02d5301def3f/chow-to-set-timeout-on-streamsocketreadasync?forum=wpdevelop
引用资料:
In UWP StreamSocket, can I read data with timeout and leave the connection open if timeout elapses
关于c# - StreamSocket : datareader. LoadAsync 无限等待,即使数据可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25364646/
DataReader.LoadAsync 不检测关闭的套接字(使用 InputStreamOptions::Partial) 我正在通过 TCP 连接向服务器发送数据并读取响应,但之后一切正常。但是在
我有一个 StreamSocket,我在关闭 UWP 应用程序期间将其丢弃。我的具有 Socket 连接的客户端仍然认为连接是事件的,即使应用程序已经关闭。 只有在重新启动套接字时,我的客户端才会给出
我正在开发一个 C#、UWP 10 解决方案,它使用快速、连续的读/写循环与网络设备通信。 API 提供的 StreamSocket 似乎工作得很好,直到我意识到存在内存泄漏:累积了 Task。在堆中
我正在使用 StreamSocketListener 在 Windows Phone 8(充当服务器)上接收由 HTTP POST 客户端发送的数据。我可以接收数据,但是当读取所有数据时,DataRe
所以我已经收到这个异常大约一个星期了,我终于设法将它变成一个易于阅读的代码片段。 作为背景,我正在为 Windows RT 编写一个应用程序,我正在尝试使用基本套接字。 为了测试,我创建了一个本地套接
我有一台运行 MPD(音乐播放器守护程序)的服务器,它通过套接字进行通信。现在我正在尝试在 Windows 商店应用程序中实现 MPD 协议(protocol)。基本上我发送一个命令并收到一个列表,该
我正在研究 WinRT(Windows8 Release Preview)。我有一个 Web 应用程序(实际上是一个更简单的 XMPP 客户端)。 我主要使用 StreamSocket 类来连接 Ja
我有一个 WinRT 应用程序,它使用 StreamSocket 和 DataWriter 执行上传。它跟踪上传所花费的时间,然后计算吞吐量。 我遇到的问题是我获得的吞吐量远高于 Wireshark
我正在尝试在 C# 中为 UWP 实现 XMPP 客户端,为了实现这一点,我使用 StreamSocket 进行 TCP 连接。 问题是对于握手和SASL auth,我需要服务器从客户端进行一系列“写
我正在尝试通过 StreamSocket 发送 HTTP 请求,但响应被 chop 为 “failedWinRTError:对象已关闭。” 这是我的代码: var count, hostName,
我的 Windows Phone 8 应用程序中有以下代码。 //connection code, done during app start socket = new StreamSocket();
在 Windows Phone 8.1 应用程序中,我必须按如下方式创建套接字。我如何更改它,以便它在我可以指定的时间段后超时? _socket = new StreamSocket(); await
我发布这个是因为我已经浪费了一天的时间来搜索和编程一个即使在 Metro 中也应该很容易设置的东西。 我正在寻找一个 C# StreamSocket 示例,它可以连接到套接字,从套接字读取数据(我不确
我尝试将已连接的 StreamSocket 附加到 SecureStreamSocket: class MyConnection : public TCPServerConnection { pr
我有以下 c#/WinRT 代码来接收来自 IMAP 命令的响应 DataReader reader = new DataReader(sock.InputStream); reader.InputS
使用 Windows StreamSocket 类 (TCP) 处理断开连接和重新连接事件的正确方法是什么? 我有一个问题,在断开连接事件后调用 async_connect 时调用“无效操作,在意外时
我有一个正在为 Windows 8/WinRT 编写的应用程序,它使用 StreamSocket API 与服务器建立流式连接。也就是说,服务器向客户端流式传输数据,有时带有元标记,并且可以随时断开连
我可以使用 TLS 1.2 成功连接到我们的服务器。但是我们可以选择传入 SNI(在客户端问候消息中),这会将我们重定向到防火墙后面的另一台服务器。如何在 C# StreamSocket 或 SslS
这是最小的可能场景,我能够准备: 此代码连接到 imap.gmail.com 读取初始服务器问候语(使用 Read 方法) 发送 NOOP 命令(NO 操作) 读取 NOOP 命令响应(再次使用 Re
我正在创建一个 Win 8 商店应用程序,我在其中使用 StreamSocket 连接到一个用 Java 编写的服务器。当我在调试中运行应用程序时,在 StreamSocket.ConnectAsyn
我是一名优秀的程序员,十分优秀!