gpt4 book ai didi

c# - Windows 应用商店应用程序 (.NET) 上的 SSDP (UDP)

转载 作者:行者123 更新时间:2023-11-30 15:35:57 25 4
gpt4 key购买 nike

我正在尝试使用 C# Windows 应用商店 应用程序实现基本的 SSDP (UDP) 广播/监听器 em>.

我发现 Windows.Networking.Sockets包含 DatagramSocket这是我需要用于 UDP 网络的类。

但是,我目前的尝试似乎执行得很好,但通过 Wireshark 没有结果,也没有从网络上的设备获得响应。

这是我目前正在使用的代码(并通过 RT 模拟器运行):

public async static Task<IEnumerable<HueBridge>> DiscoverAsync(TimeSpan timeout)
{
if (timeout <= TimeSpan.Zero)
throw new ArgumentException("Timeout value must be greater than zero.", "timeout");

var discoveredBridges = new List<HueBridge>();

using (var socket = new DatagramSocket())
{
while (true)
{
var bridgeWasFound = false;

socket.MessageReceived += (sender, e) =>
{
var bpx = true; // breakpoint here for success
};

var multicastIP = new HostName("239.255.255.250");
await socket.BindServiceNameAsync("1900");
socket.JoinMulticastGroup(multicastIP);

using (var writer = new DataWriter(socket.OutputStream))
{
var request = new StringBuilder();
request.AppendLine("M-SEARCH * HTTP/1.1");
request.AppendLine("HOST: 239.255.255.250:1900");
request.AppendLine("MAN: ssdp:discover");
request.AppendLine("MX: 5");
request.AppendLine("ST: ssdp:all");

writer.WriteString(request.ToString());
await writer.FlushAsync();
}

if (timeout > TimeSpan.Zero)
await Task.Delay(timeout);

if (!bridgeWasFound)
break; // breakpoint here for failure check
}
}

return discoveredBridges;
}

关于我可能做错了什么的任何想法?我没有遇到异常,而且我在 list 中设置了正确的功能。我的断点在 break总是被击中,我使用 10 秒的超时。

最佳答案

看来我找到了问题。

首先,我应该使用 socket.BindEndpointAsync(null, string.Empty) 而不是 socket.BindServiceNameAsync("1900"),它将正确监听广播数据包.

其次,writer.FlushAsync() 不写入套接字;但是,writer.StoreAsync() 可以。

这是最终结果,它确实(几乎)完美地工作:

public async static Task<IEnumerable<HueBridge>> DiscoverAsync(TimeSpan timeout)
{
if (timeout <= TimeSpan.Zero)
throw new ArgumentException("Timeout value must be greater than zero.", "timeout");

var discoveredBridges = new List<HueBridge>();
var multicastIP = new HostName("239.255.255.250");
var bridgeWasFound = false;

using (var socket = new DatagramSocket())
{
socket.MessageReceived += (sender, e) =>
{
var reader = e.GetDataReader();
var bytesRemaining = reader.UnconsumedBufferLength;
var receivedString = reader.ReadString(bytesRemaining);

// TODO: Check for existing bridges, only add new ones to prevent infinite loop.
// TODO: Create new bridge and add to the list.

bridgeWasFound = true;
};

await socket.BindEndpointAsync(null, string.Empty);
socket.JoinMulticastGroup(multicastIP);

while (true)
{
bridgeWasFound = false;

using (var stream = await socket.GetOutputStreamAsync(multicastIP, "1900"))
using (var writer = new DataWriter(stream))
{
var request = new StringBuilder();
request.AppendLine("M-SEARCH * HTTP/1.1");
request.AppendLine("HOST: 239.255.255.250:1900");
request.AppendLine("MAN: ssdp:discover");
request.AppendLine("MX: 3");
request.AppendLine("ST: ssdp:all");

writer.WriteString(request.ToString());
await writer.StoreAsync();

if (timeout > TimeSpan.Zero)
await Task.Delay(timeout);

if (!bridgeWasFound)
break;
}
}
}

return discoveredBridges;
}

关于c# - Windows 应用商店应用程序 (.NET) 上的 SSDP (UDP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14286859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com