C#套接字侦听器未绑定到端口

时间:2018-07-24 14:15:12

标签: c# sockets tcplistener

我尝试监听服务器上的特定端口。我编写了一个简单的控制台应用程序,但出现错误:

  

每个套接字地址(协议/网络地址/端口)仅一种用法   通常是允许的。

但是,我没有任何监听该端口的过程。资源管理器和CurrPorts不显示任何信息。

我的代码(所有代码):

var ipEndPoint = new IPEndPoint(IPAddress.Any, 7001);
var tcpListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpListener.Bind(ipEndPoint);
tcpListener.Listen(100);

我的问题是:

  1. 如何找到哪个进程监听端口? Currports不显示,也将重新显示。
  2. 为什么node.js监听端口并收到消息?有什么不同?
  3. 我认为我有一个隐藏的线程,但找不到。我使用ProcessExplorer。

更新:

服务器重置后运行控制台应用程序时,它可以正常工作。 但是,当关闭并重​​新打开该应用程序时,它无法正常工作,并且存在上述例外情况。

2 个答案:

答案 0 :(得分:0)

我在mysql端口3306上遇到了同样的问题。tcpview,netstat -ano或currports均未显示任何内容。

但是

netsh interface ipv4 show excludedportrange protocol=tcp

显示该端口已保留。 似乎hyper-v / docker是罪魁祸首,而解决方法是禁用hyper-v,并保留端口

netsh int ipv4 add excludedportrange protocol=tcp startport=<your port> numberofports=1

并重新启用Hyper-v。

来源:https://stackoverflow.com/a/54727281/32083。 这里有更多背景https://github.com/docker/for-win/issues/3171

答案 1 :(得分:0)

我相信您与该端口的连接尚未完全关闭。这样可以防止端口再次打开。要解决该问题,必须在绑定端口之前设置套接字选项ReuseAddress。

    var ipEndPoint = new IPEndPoint(IPAddress.Any, 7001);
    var tcpListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    tcpListener.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
    tcpListener.Bind(ipEndPoint);
    tcpListener.Listen(100);