IPv6套接字适用于Mono控制台应用程序,但不适用于Unity应用程序

本文关键字:应用程序 适用于 Unity 不适用 控制台 套接字 Mono IPv6 | 更新日期: 2023-09-27 18:24:23

我对一些使用套接字的代码有问题。我想通过IPv6连接我的脚本,但当我在Unity中运行此脚本时,我收到了SocketException。此代码可以完美地作为MonoDevelop:中的控制台应用程序项目使用

using System;
using System.Net;
using System.Net.Sockets;
namespace socketIPv6
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Socket s;
            s = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
            IPAddress ip = IPAddress.Parse("ff15::2");
            s.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.AddMembership, new IPv6MulticastOption(ip));
            IPEndPoint ipep = new IPEndPoint(IPAddress.IPv6Any, 26000);
            s.Bind(ipep);
            while (true) {
                byte[] b = new byte[1024];
                s.Receive (b);
                string str = System.Text.Encoding.ASCII.GetString (b, 0, b.Length);
                Console.WriteLine (str.Trim ());
            }
        }
    }
}

但是相同的代码(我只将"Console.WriteLine()"更改为"Debug.Log()")不能作为Unity项目使用。此代码中断,但出现以下异常:"SocketException: An address incompatible with the requested protocol was used."有人能帮我吗?谢谢

IPv6套接字适用于Mono控制台应用程序,但不适用于Unity应用程序

请记住,您从控制台应用程序链接到的Mono框架版本可能与Unity的Mono框架不同。

这可能部分回答了正在发生的事情:

用ILSpy分解Unity'Editor'Data'Mono'lib'mono'2.0'System.dll在不同的地方显示出对的依赖

internal static void Socket.CheckProtocolSupport()

在其中的一个其它相关的检查中,其尝试从部分system.net/settings读取.NET配置文件。如果你看Unity'Editor'Data'Mono'etc'mono'2.0'machine.config,它有system.net/settings/<ipv6 enabled="false"/>

因此,要么该配置文件不相关或过时,要么Unity似乎已经关闭或不支持IPv6套接字。

尝试在播放器设置中使用".Net 2.0子集"api兼容性。我也在做同样的事情,这是因为我们使用了完整的".Net 2.0"

如果您感兴趣,这是错误报告:https://fogbugz.unity3d.com/default.asp?804510_c5ei44diq6ktnh1u