相关疑难解决方法(0)

如何在退出拥有进程后释放"守护进程"TCP端口侦听器?

背景

我有一个.net 4.0 WCF应用程序,它在net.tcp端口667上进行侦听.(Windows 7机器)
某些时候,应用程序会以非正常方式退出(例如,用户会终止该进程).
现在发生一件奇怪的事情:港口仍然开放.当用户重新启动应用程序时,它无法侦听该端口,因为它已在使用中.

奇怪的是,即使拥有进程被杀死,操作系统也不会关闭端口,即使在几个小时后也没有.

以下是一些观察结果:

  • 在TcpView上进程是<non-existent>,PID属于旧的(被杀死的)进程,状态是LISTENING.本地地址是我的机器,该端口上有两个IPV4IPV6监听器.
  • TcpView上的"关闭连接"和"结束进程"操作对该端口没有影响.
  • Process Explorer不显示旧(已终止)进程.我试图搜索PID或端口但没有找到任何东西.
  • 运行netstat -a -b -n -o所涉及的可执行文件时显示为System 和本地地址0.0.0.0.其他信息与TcpView相同.

我发现关闭该端口的唯一方法是系统重启...

问题

  1. 有没有办法配置WCF net.tcp服务主机监听器,以避免在进程不正常后存在延迟?
  2. 有没有办法以编程方式关闭该端口?如果有,我的应用程序可以先尝试关闭该端口,然后再尝试收听它.
  3. 是否有可以关闭此类"守护程序"端口的实用程序?(因为TcpView无法做到这一点)
  4. 这是操作系统错误吗?操作系统是否应该跟踪这些"守护程序"监听器并在进程存在后关闭它们?

wcf tcp

6
推荐指数
1
解决办法
2297
查看次数

当进程被终止时,WCF tcp连接保持打开状态

我在这里看到过类似的问题,但找不到答案.我有一个使用WCF打开到远程地址的连接的应用程序,有时当我从任务管理器中杀死应用程序或应用程序非正常地关闭连接保持打开然后当我重新启动我的应用程序时我得到一个异常告诉我已经有这个端口上的监听器.

几个问题:

  1. 为什么这样的连接在我杀死进程后保持打开状态?
  2. 当进程非正常关闭时,如何关闭此连接?
  3. 在尝试创建新连接之前,如何关闭连接?

serer方:

var url = Config.GetRemoteServerUrl();
var binding = new NetTcpBinding();

binding.Security.Mode = SecurityMode.None;
binding.ReliableSession.Enabled = Config.RelaiableSession;
binding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue;
binding.MaxConnections = Config.MaxConcurrentSessions;
binding.ReaderQuotas.MaxArrayLength = Config.ReaderQuotasMaxArrayLength;
binding.MaxReceivedMessageSize = Config.MaxReceivedMessageSize;
binding.SendTimeout = new TimeSpan(0,0, 0, 0,Config.SendTimeout);
binding.OpenTimeout = new TimeSpan(0,0, 0, 0,Config.OpenTimeout);

host = new ServiceHost(ServerFacade.Instance, new Uri[] { new Uri(url) });

host.AddServiceEndpoint(typeof(ITSOServiceContract), binding, url);

host.Open();

serverFacade = host.SingletonInstance as IServerFacade;
Run Code Online (Sandbox Code Playgroud)

c# wcf tcp

5
推荐指数
1
解决办法
1063
查看次数

标签 统计

tcp ×2

wcf ×2

c# ×1