我目前正在使用C#remoting开发基于客户端 - 服务器的游戏。在我尝试设置TcpServerChannel
之前,一切似乎都运行良好。我正在使用复杂的构造函数(使用IDictionary
和stuff),但即使使用普通的TcpServerChannel(int port)
构造函数,问题似乎也会出现。
当我尝试创建通道实例时,会抛出一条SocketException
,并显示消息“没有这样的主机已知”。堆栈跟踪:
at System.Net.Dns.GetAddrInfo(String name)
at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
at System.Net.Dns.GetHostEntry(String hostNameOrAddress)
at System.Runtime.Remoting.Channels.CoreChannel.GetMachineIp()
at System.Runtime.Remoting.Channels.Tcp.TcpServerChannel.SetupMachineName()
at System.Runtime.Remoting.Channels.Tcp.TcpServerChannel..ctor(IDictionary properties, IServerChannelSinkProvider sinkProvider, IAuthorizeRemotingConnection authorizeCallback)
at System.Runtime.Remoting.Channels.Tcp.TcpServerChannel..ctor(IDictionary properties, IServerChannelSinkProvider sinkProvider)
at Some.Namespace.Server.Start()
然而,经过一些研究后我发现问题是CoreChannel.GetMachineIp()
方法。我找到了CoreChannel
类here的代码并注意到,Dns.GetHostEntry(string hostNameOrAddress)
方法被调用了两次。在第一次调用中,Dns.GetHostName()
方法的返回值(正确返回我的计算机名称,假设我们在这里得到“hostname”)作为参数传递,而在第二次调用中传递返回的IPHostEntry.HostName
。出现问题的地方是:由于我的计算机位于域内(我们称之为“域”),因此返回的IPHostEntry.HostName
包含“hostname.domain”而不仅仅是“hostname”。然后第二个Dns.GetHostEntry("hostname.domain")
调用抛出异常,因为“hostname.domain”未知。
有一个similar question,但它对我没有任何帮助。
我不知道为什么这个东西会这样工作,但我无法更改我的计算机名称或域名,所以我陷入困境,真的需要一些帮助。
我正在使用Windows 7 64位(如果重要),VS Professional 2012 Update 4和.NET Framework 4.5。
感谢您的帮助