C# 用于检查设备连接的SteamSocket TCP
我正在使用“StreamSocket”“Tcp”连接在Windows IoT Core上的主机和客户端设备之间进行通信。目前,我使用每秒轮询来检查客户端设备的连接状态。我想知道是否有更好、更有效的方法。谢谢 据我所知,没有比这更好的方法了。有两种检测StreamSocket断开的方法: 发送心跳消息以监视另一个sideserver是否已关闭。 读取0长度表示流的结束。 此外,您还可以通过检测网络连接。通过检测,应用程序可以知道网络是否无效,因为这是导致StreamSocket断开连接的主要原因。更多信息请参见 如果将主机更改为服务器,将所有设备更改为连接到主机的客户端,则可以通过开始侦听tcp端口。该事件可能检测到传入的连接和状态已更改C# 用于检查设备连接的SteamSocket TCP,c#,tcp,uwp,windowsiot,C#,Tcp,Uwp,Windowsiot,我正在使用“StreamSocket”“Tcp”连接在Windows IoT Core上的主机和客户端设备之间进行通信。目前,我使用每秒轮询来检查客户端设备的连接状态。我想知道是否有更好、更有效的方法。谢谢 据我所知,没有比这更好的方法了。有两种检测StreamSocket断开的方法: 发送心跳消息以监视另一个sideserver是否已关闭。 读取0长度表示流的结束。 此外,您还可以通过检测网络连接。通过检测,应用程序可以知道网络是否无效,因为这是导致StreamSocket断开连接的主要原因。
StreamSocketListener listener = new StreamSocketListener();
listener.ConnectionReceived += OnConnection;
private async void OnConnection(
StreamSocketListener sender,
StreamSocketListenerConnectionReceivedEventArgs args)
{
DataReader reader = new DataReader(args.Socket.InputStream);
try
{
while (true)
{
// Read first 4 bytes (length of the subsequent string).
uint sizeFieldCount = await reader.LoadAsync(sizeof(uint));
if (sizeFieldCount != sizeof(uint))
{
// The underlying socket was closed before we were able to read the whole data.
//Detect disconnection
return;
}
// Read the string.
uint stringLength = reader.ReadUInt32();
uint actualStringLength = await reader.LoadAsync(stringLength);
if (stringLength != actualStringLength)
{
// The underlying socket was closed before we were able to read the whole data.
//Detect disconnection
return;
}
//TO DO SOMETHING
}
}
catch (Exception exception)
{
//TO DO SOMETHING
}
}
检测不正常的断开连接确实是有史以来最烦人的事情之一。@MichealXu MSFT谢谢。@NPras您有什么建议来处理它吗?引用这句话:断开的连接只能通过发送数据来检测。您的heartbeat/keepalive方法和捕获所有可能失败的不同方式通常是一条可行之路。