问题是,如果IPAddress.Any作为参数给出,以下代码可以正常工作,但如果使用`IPAddress.IPv6Any则抛出错误.
我收到错误#10057
套接字未连接.
不允许发送或接收数据的请求,因为套接字未连接(当使用sendto在数据报套接字上发送时)没有提供地址.任何其他类型的操作也可能返回此错误 - 例如,如果已重置连接,则setsockopt设置SO_KEEPALIVE.
为什么它不能像IPv6一样工作?我很确定它不是防火墙,因为端口保持不变并且它适用于IPv4(我的防火墙应该传递我的应用程序发出的任何请求).
要简化代码,它是这样的:
听众:
listener = new TcpListener(IPAddress.IPv6Any, portNr);
listener.AllowNatTraversal(true);
listener.Start();
listener.BeginAcceptTcpClient(this.AcceptClient, null);
Run Code Online (Sandbox Code Playgroud)
客户端:
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();
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试建立TCP连接的"服务器端".
我所做的是我在localhost启动一个监听器,然后作为客户端连接到它(并允许其他人作为客户端加入).
我想要实现的是这个TCP服务器的直接可寻址性,遵循这篇文章:http://blogs.msdn.com/b/ncl/archive/2009/07/27/end-to-end-connectivity -with-NAT遍历-的.aspx
我这样做的原因是我希望人A能够在他们都在NAT路由器后面时连接到B人.
我知道这个答案来得有点晚了,但我也遇到了这个问题,而且与客户相关。问题是,您提供的代码...
client = new TcpClient();
Run Code Online (Sandbox Code Playgroud)
TcpClient...创建无法解释 IPv6 地址的IPv4 实例。因此,如果您在初始化时已经有了 IP 地址,请尝试像这样初始化您的 TcpClient:
TcpClient client = new TcpClient(ip.AddressFamily);
Run Code Online (Sandbox Code Playgroud)
如果变量ip是字符串,则需要先将其转换为 IPAddress 类型:
IPAddress iAddr = IPAddress.Parse(ip);
Run Code Online (Sandbox Code Playgroud)
实际上 IPv6-TcpClient 似乎也兼容 IPv4-Addresses,因此您也可以按如下方式初始化客户端:
TcpClient client = new TcpClient(AddressFamily.InterNetworkV6)
Run Code Online (Sandbox Code Playgroud)
虽然上面的建议似乎是最干净的,但底部的建议似乎是更通用的。最后取决于您的喜好。
| 归档时间: |
|
| 查看次数: |
4403 次 |
| 最近记录: |