IPAddress.Any失败

时间:2010-08-06 16:39:31

标签: c# .net network-programming

)。今天我用TcpListener遇到了一些问题。事情很奇怪。最初,我使用了新的TcpListener(port)构造函数,但是它已被标记为已过时。所以我放弃了它并使用了它:

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

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

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

HOWEVER ,更改为新的IPEndPoint(IPAddress.Any,ServerPort)似乎可以解决问题!这有两个方面很愚蠢:

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

  2. 现在:IPAddress.Any返回0.0.0.0(!?),同时继续为ipAddress变量分配正确的IP(192.168.1.102)。结果?如果使用ipAddres,我的客户端无法连接,但使用IPAddress.Any时连接,即使它是0.0.0.0。

  3. 我对此感到困惑......有什么想法吗?

    我目前在Form_HandleCreated中有这个,但是当我在Form的构造函数中使用它时它表现得很奇怪。

    LATER EDIT:我认为我错了IPAddress.Any返回192.168.1.102。我可能打印出别的东西,因为很多人都指出0.0.0.0是什么.Any应该返回。对不起:: - D。

3 个答案:

答案 0 :(得分:8)

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(localhost)不是“我的本地网络IP”的同义词。

答案 1 :(得分: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();
    }
}

答案 2 :(得分:1)