【问题标题】:TcpClient connect fails with IPv6AnyTcpClient 连接失败并出现 IPv6Any
【发布时间】:2011-12-31 14:23:54
【问题描述】:

问题是,如果将IPAddress.Any 作为参数给出,则以下代码运行良好,但如果使用`IPAddress.IPv6Any,则会引发错误。

我收到错误 #10057

套接字未连接。

发送或接收数据的请求被拒绝,因为套接字是 未连接并且(在使用数据报套接字发送时 sendto) 没有提供地址。任何其他类型的操作可能 也返回这个错误——例如,setsockopt 设置 SO_KEEPALIVE 如果 连接已重置。

为什么它不能作为 IPv6Any 工作?我很确定这不是防火墙,因为端口保持不变并且它适用于 IPv4(我的防火墙应该通过我的应用程序发出的任何请求)。

为了缩短代码,它是这样的:

聆听者:

listener = new TcpListener(IPAddress.IPv6Any, portNr);
listener.AllowNatTraversal(true);
listener.Start();
listener.BeginAcceptTcpClient(this.AcceptClient, null);

客户:

client = new TcpClient();
client.NoDelay = true;            

try
{
    this.client.Connect(ip, port);  //ip = "localhost" when connecting as server
}
catch (Exception ex)
{
    FileLogger.LogMessage(ex);
    Disconnect();
}

我正在尝试设置 TCP 连接的“服务器端”。

我所做的是在本地主机上启动一个侦听器,然后作为客户端连接到它(并允许其他人也作为客户端加入)。

我想要实现的是这个 TCP 服务器的直接寻址能力,遵循这篇文章:http://blogs.msdn.com/b/ncl/archive/2009/07/27/end-to-end-connectivity-with-nat-traversal-.aspx

我这样做的原因是我希望 A 能够在 B 都位于 NAT 路由器之后时连接到他们。

【问题讨论】:

  • 至少我发现我的接口有很多 IPv6 地址。 Vista和Win7不是默认安装的吗?
  • 如果您的接口分配了 v6 地址,那么您必须安装它。我暂时没有想法。
  • 您使用的是什么操作系统?我从这篇文章 (msdn.microsoft.com/en-us/library/…) 中了解到,由于需要 UAC 提升,套接字可能无法打开。

标签: c# ipv6 tcpclient


【解决方案1】:

我知道这个答案来得有点晚,但我也遇到了这个问题,它与客户有关。问题是,您提供的代码...

client = new TcpClient();

... 创建一个无法解释 IPv6 地址的 TcpClient 的 IPv4 实例。所以如果你在初始化的时候已经有了IP地址,试着像这样初始化你的TcpClient:

TcpClient client = new TcpClient(ip.AddressFamily);

如果变量ip是字符串,需要先转换成IPAddress类型:

IPAddress iAddr = IPAddress.Parse(ip);

实际上 IPv6-TcpClient 似乎也兼容 IPv4-Addresses,因此您也可以按如下方式初始化您的客户端:

TcpClient client = new TcpClient(AddressFamily.InterNetworkV6)

虽然上面的建议似乎是最干净的建议,但下面的建议似乎是更普遍的建议。最后,这取决于您的喜好。

【讨论】:

  • 我没有代码来验证你的答案,但这似乎是一个合法的答案。
【解决方案2】:

我解决了一个类似的问题,即以下行只会阻止来自 IPv4 地址的连接:

listener = new TcpListener(IPAddress.IPv6Any, portNr);

似乎套接字在配置为接受 IPv6 连接时,默认情况下只接受 IPv6 连接。为了解决这个问题,我必须将我的代码更新为:

listener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
listener.Start();

【讨论】:

    【解决方案3】:

    当您使用TcpClient.Connect(string, int) 时,您可能会因为 DNS 解析而中断。

    虽然 Microsoft 记录会首先尝试 IPv6 地址,但解析可能只返回 IPv4 地址。

    http://msdn.microsoft.com/en-us/library/8s2yca91.aspx

    因此,您可以尝试在客户端调用TcpClient.Connect(IPAddress.IPv6Loopback, port) 来测试它是否有效吗?

    【讨论】:

      【解决方案4】:
      IPAddress.Loopback == FAIL
      IPAddress.IPv6Loopback == SUCCESS
      

      也许localhost 在您的情况下映射到IPv4 Loopback 地址?

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        • 2014-07-04
        • 2018-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多