我尝试监听服务器上的特定端口。我编写了一个简单的控制台应用程序,但出现错误:
每个套接字地址(协议/网络地址/端口)仅一种用法 通常是允许的。
但是,我没有任何监听该端口的过程。资源管理器和CurrPorts不显示任何信息。
我的代码(所有代码):
var ipEndPoint = new IPEndPoint(IPAddress.Any, 7001);
var tcpListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpListener.Bind(ipEndPoint);
tcpListener.Listen(100);
我的问题是:
更新:
服务器重置后运行控制台应用程序时,它可以正常工作。 但是,当关闭并重新打开该应用程序时,它无法正常工作,并且存在上述例外情况。
答案 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);