【发布时间】: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 提升,套接字可能无法打开。