2010-08-06 39 views
1

)。我今天用TcpListener进入了一些问题。事情很奇怪。最初,我使用了新的TcpListener(port)构造函数,但它已被标记为过时。所以我放弃了它,并用这个来代替:IPAddress.Any Fail

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; 
    IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, ServerPort); 
    TcpListener tcpServer = new TcpListener(ipLocalEndPoint); 

    _TCPClient = tcpServer.AcceptTcpClient(); 
    GotClient(); 

我这样做,在一个线程,当然,这样才不会锁定应用程序。现在,发生的情况是,即使ipAddress正确,服务器也不会接受任何传入连接。

但是,更改为新的IPEndPoint(IPAddress.Any,ServerPort)似乎有伎俩!这在2种方式中很愚蠢:

  1. 2小时前,IPAddress.Any返回192.168.1.102这是我的正确本地IP。这是相同的IP地址 IPAddress!但是使用ipAddress它不起作用,而使用IPAddress.Any它工作(也就是说,它成功地接受了来自我的客户端的连接)。

  2. 当前:IPAddress.Any返回0.0.0.0(!?),而ipAddress变量继续分配给我正确的IP(192.168.1.102)。结果?如果使用ipAddres,我的客户端不能连接,但当使用IPAddress.Any时,连接,即使它是0.0.0.0。

我完全被这个困惑......任何想法?

我目前在Form_HandleCreated中有这个,但当我在Form的构造函数中使用它时,它的行为也很奇怪。

后来编辑:我想我错了IPAddress.Any返回192.168.1.102。我可能会印出其他的东西,因为你们许多人都表示0.0.0.0是什么。任何应该返回。对不起:: - D.

回答

7

IPAddress.Any应该返回0.0.0.0,这是正常的。你真的确定它最初返回了其他东西吗?

至于为什么你以前不能连接,如果你正在监听192.168.1.102,并试图连接到127.0.0.1(localhost),那么它将无法工作。如果要连接到该IP地址,则需要在127.0.0.1上进行监听。

本质上,您必须监听您尝试连接的IP地址。听取0.0.0.0意味着“侦听所有可用的IP地址”。请记住,127.0.0.1(本地主机)不是“我的本地网络IP”的同义词。

+0

嗨,感谢您的回答:: - D.是的,我想我犯了一个错误。任何和打印在控制台ipAddress代替。 无论如何,我试图从Device Emulator(从.Net CF应用程序)连接到192.168.1.102。所以我没有尝试127.0.0.1。尽管......想到了这个想法......如果模拟器本身能够通过它呢?虽然在.Net Compact Framework的套接字中我特别要求192.168.1.102。 – Axonn 2010-08-06 16:51:33

+1

如果你试图从模拟器连接到主机,我不知道IP地址是什么样的......可能有一些NAT,我不能说。 – Mark 2010-08-06 16:55:06

+1

另外,它让我想知道是否已经在仿真器和主机之间建立了网络连接。我似乎记得模拟器中有多种选项用于网络工作。另外,请确认您的防火墙设置,它可能会被阻止,具体取决于您设置的方式。 – Mark 2010-08-06 16:56:56

1
+0

我可能犯了一个错误。也许向控制台打印一些其他变量(如ipAddress)。对不起,如果我这样做。 – Axonn 2010-08-06 16:49:08

+0

@Axonn:我不认为这是你必须在这里认识的东西。我相信我们已经完成了至少一次:-) – Kendrick 2010-08-06 18:02:42

+0

我后来编辑它:: - )。但是这个网站太快了*笑*。永远不会令我惊叹。真的很棒的社区,我们到了这里。我不回答问题,但我尽我所能回馈社区:免费软件和网站上的文章:: - )。 – Axonn 2010-08-06 18:11:09

4

0.0.0.0是空白的IP地址,意思是“我不在乎哪个IP你可以使用” - 也就是说,它意味着你要听的所有接口。它被记录应该返回它。

以后编辑:首先不要拨打[0]。您的主机名可能没有任何关联记录。即使它你a)不知道命令b)你不知道它们在哪里(即它可能只有127.0.0.1即回送)。

单声道这样的代码工作(用netstat等检查)):

using System; 
using System.Net; 
using System.Net.Sockets; 

public class test { 
    public static void Main(String[] args) { 
     IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; 
     IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 8888); 
     TcpListener tcpServer = new TcpListener(ipLocalEndPoint); 
     tcpServer.Start(); // Without this line there is exception 
     var _TCPClient = tcpServer.AcceptTcpClient(); 
    } 
} 
+0

嗨,谢谢回答:: - )。所以这就是为什么这些作品...我明白了。嗯,问题依然存在......如何让它在.1.102上工作。我不想听所有的接口。 – Axonn 2010-08-06 16:52:19

+1

我回复了“稍后编辑”。可能作为我的作品,但至少有一些答案。 – 2010-08-06 17:05:38

+0

谢谢Maciej :: - )。它可能与仿真器有关 - 我通过它连接,而不是通过物理设备。但是,在模拟器中,我试图连接到192.168.1.102,所以我不明白为什么它实际上没有这样做。正如Mark所建议的那样,可能是一些NAT的东西。我试着看看哪些端口正在使用,但Wireshark似乎没有工作出于某种原因。 我刚把我的应用程序移动到我的HTC Tytn2,现在它可以工作。那个连接到192.168.1.102所以这可能是答案:模拟器通过其他地址。 – Axonn 2010-08-06 17:40:20