)。今天我用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)似乎可以解决问题!这有两个方面很愚蠢:
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)。结果?如果使用ipAddres,我的客户端无法连接,但使用IPAddress.Any时连接,即使它是0.0.0.0。
我对此感到困惑......有什么想法吗?
我目前在Form_HandleCreated中有这个,但是当我在Form的构造函数中使用它时它表现得很奇怪。
LATER EDIT:我认为我错了IPAddress.Any返回192.168.1.102。我可能打印出别的东西,因为很多人都指出0.0.0.0是什么.Any应该返回。对不起:: - D。
答案 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)