C# IP地址。任何失败

C# IP地址。任何失败,c#,.net,network-programming,C#,.net,Network Programming,)。我今天和TcpListener有点问题。事情很奇怪。最初,我使用了新的TcpListener(port)构造函数,但它已被标记为过时。所以我把它扔了,改用这个: IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, ServerPort); TcpListener tcpS

)。我今天和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是正确的,服务器也不会接受任何传入连接

但是,更改为新的IPEndPoint(IPAddress.Any,ServerPort)似乎可以做到这一点!这在两个方面都很愚蠢:

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

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

  • 我完全被这件事弄糊涂了。。。有什么想法吗

    我目前在Form_HandleCreated中创建了它,但当我在表单的构造函数中也创建了它时,它的行为很奇怪


    稍后编辑:我想我对IPAddress的看法是错误的。任何返回192.168.1.102的地址。我可能打印出了其他内容,因为你们中的许多人都指出0.0.0.0是什么。任何人都应该返回。抱歉::-D.

    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”的同义词。我猜它是空白IP地址,意思是“我不在乎你会使用哪个IP”-也就是说,它意味着你想监听所有接口。它被记录下来了,它应该归还它

    稍后编辑:首先不要调用
    [0]
    。您的主机名可能没有任何相关记录。即使是这样,你a)不知道顺序b)你不知道它们在哪里(即,可能只有127.0.0.1,即环回)

    在mono上,此类代码工作(通过netstat等进行检查):


    我可能在那件事上弄错了。可能正在向控制台打印其他变量(如ipAddress)。如果我这样做了,我很抱歉。@Axann:我认为你不必为此道歉。我相信我们至少都做过一次:-)我后来编辑过:-)。但是这个网站笑得太快了。我总是感到惊讶。我们这里的社区真的很棒。我不回答问题,但我尽我所能回馈社区:免费软件和网站上的文章::-)。您好,谢谢您回答::-D。是的,我想我犯了一个错误。Any改为打印在控制台ipAddress中。无论如何,我正在尝试从设备模拟器(从.Net CF应用程序)连接到192.168.1.102。所以我不是在尝试127.0.0.1。虽然。。。这个想法浮现在我的脑海里。。。如果仿真器本身经历了这个过程呢?尽管在.Net Compact Framework上的socket中,我特别要求192.168.1.102。如果您试图从模拟器连接到主机,我不知道IP地址会是什么样子。。。可能有一些NAT在那里,我不能说。而且,我突然问你是否已经在模拟器和主机之间建立了网络。我似乎记得在模拟器中有各种各样的选项来说明网络是如何工作的。此外,请验证防火墙设置,它可能会被阻止,具体取决于您的设置方式。正如我所说,如果我使用0.0.0.0,模拟器将成功连接。所以没有防火墙问题。我将使用端口嗅探器查看具体的位置/方式。我刚刚将我的应用程序移动到我的HTC Tytn2上,现在它可以工作了。这一个连接到192.168.1.102,所以可能这就是答案:模拟器通过其他地址。您好,谢谢您的回答:-)。所以这就是为什么它有效。。。我明白了。嗯,问题仍然是。。。如何让它工作。1.102。我不想听所有的界面。我回答“稍后编辑”。可能对我有用,但这至少是一些答案。它可能与模拟器有关-我是通过它连接的,而不是通过物理设备。但是,在emulator中,我尝试连接到192.168.1.102,所以我不明白为什么它实际上没有这样做。可能是NAT的东西,马克已经说过了。我试着查看正在使用的端口,但Wireshark似乎由于某种原因无法工作。我刚把我的应用程序移到我的HTC Tytn2上,现在它可以工作了。其中一个连接到192.168.1.102,所以答案可能是:模拟器通过其他地址。
    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();
        }
    }