此流不支持超时

本文关键字:超时 不支持 | 更新日期: 2023-09-27 17:56:32

有人可以解释为什么我得到 此流不支持超时。 错误。

如果我像这样使用我的代码,一切都很好。我的套接字连接到服务器并检索信息。(这种方法就像虚拟的,因为连接发生在一台服务器上,并且在一切开始时)

 private async Task Update()
    {
        while (true)
        {
            server = Ips.First();
            if (server.Map != sq.map || server.Name != sq.name || server.Players != sq.players)
            {
                return;
            }
        }
   }

在实际应用程序中,我需要查询很多服务器。所以我尝试这样的事情(因为我是菜鸟,找不到更好的方法)

foreach (var server in Ips)
            {
                sq.Connect(new Windows.Networking.HostName(server.Ip), server.Port);
                if (server.Map != sq.map || server.Name != sq.name || server.Players != sq.players)
                {
                    return;
                }
            }

这就是我得到此流错误不支持超时的地方。有人可以解释为什么,也许告诉我我也应该在哪里看吗?

我的错误出现在此方法的第一行:(流流 = 参数。GetDataStream()。AsStreamForRead();)

        private async void Socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
    {
        Stream streamIn = args.GetDataStream().AsStreamForRead();
        StreamReader reader = new StreamReader(streamIn);
        string message = await reader.ReadToEndAsync();
        byte[] packet = System.Text.Encoding.ASCII.GetBytes(message);
        Parser parser = new Parser(packet);

此流不支持超时

但是为什么第一种方法有效?

您的第一个代码块和第二个代码块之间的主要区别是 sq.Connect(new Windows.Networking.HostName(server.Ip), server.Port); ,根据您的代码,有可能

  • 你只连接到Ips.First(),代码运行到"返回"跳出"foreach"。

  • 您建立两个(或更多)连接,直到代码运行以"返回"。

我不知道你的sq是什么,DatagramSocket类中没有Connect(hostname, serverport)方法,只有一个类似的方法,但有一个aysnc:DatagramSocket.ConnectAsync(HostName,String)| connectAsync(HostName,String)方法。

映射到我列出的两种可能性:

  • 如果"foreach"中的代码只运行一次(表示Ips.First()连接),那么两个代码块之间的区别在于您在第二个代码中建立了连接,这可能是一个原因。

  • 对于第二种可能性,我假设您实际上正在使用ConnectAsync方法,然后sq c sq = new DatagramSocket();,并且它使用一个DatagramSocket连接到多个服务器。但是ConnectAsync方法是与单个远程端点进行通信,因此我认为这也可能是这里的原因。

在实际应用程序中,我需要查询很多服务器。

我认为对于您的方案,最好不要使用连接,您可以将DatagramSocket绑定到本地端口,并将DatagramSocket对象加入多播组。可以参考官方的DatagramSocket示例,场景5是针对组播和广播的,可以看看。

如果您在这里有任何问题,请发表评论。