相关疑难解决方法(0)

在WCF net.tcp绑定上更改套接字选项

我有一个.net 4.0 WCF应用程序,它使用net.tcp绑定并实现一些服务.
我想为该绑定设置TCP套接字选项(ReuseAddress选项.相关问题解释了我为什么要这样做).
如果我使用Raw Sockets,我可以使用Socket.SetSocketOption方法.

有没有办法以某种方式从net.tcp绑定中提取底层Raw Socket以更改其选项?或者其他一些设置此选项的方法?

sockets wcf tcp .net-4.0

15
推荐指数
1
解决办法
735
查看次数

当所有者进程已被终止时关闭TCP连接

我有一个Windows服务 - 当它启动时 - 打开一些WCF服务来监听8000端口.碰巧这项服务有时会崩溃.如果是这样,TCP连接不会被释放,因此如果我尝试再次启动它,会导致我的服务抛出异常:

AddressAlreadyInUseException:IP端点0.0.0.0:8000上已有一个侦听器

一些观察:

  • 当运行CurrPorts或者netstat -ano,我可以看到8000端口仍然在使用(在LISTENING状态),并通过进程ID拥有XXX这相当于我的服务进程ID.但我的服务已经崩溃,并且不再出现在任务管理器中.因此,我无法杀死释放端口的过程!当然,运行taskkill /PID XXX返回:

    错误:找不到"XXX"进程.

  • 运行CurrPorts或者netstat -b,我可以看到创建监听端口所涉及的进程名称是System,而不是MyService.exe(因为它是MyService.exe我的服务运行时).

  • 我试图使用CurrPorts关闭连接,但我总是收到以下错误消息:

    无法关闭一个或多个TCP连接.请注意,您必须以管理员身份运行此工具才能关闭TCP连接.

    CurrPorts截图

    (不用说,我以管理员身份运行CurrPorts ......)

  • TCPView也没有太大帮助:与8000端口关联的进程名称是<non-existent>,并且执行"结束进程"或"关闭连接"无效.

  • 我尝试XXX使用Process Explorer查看是否没有与PID关联的子进程,但这里没有运气.

  • 如果我正确关闭服务(崩溃之前),则正确释放TCP连接.这是正常的,因为我在服务时关闭了WCF服务主机OnStop().


我发现释放连接的唯一方法是重新启动服务器(这在生产环境中不方便,你可以猜到).等待没有帮助,TCP连接永远不会释放.

如何在不重新启动Windows服务器的情况下关闭连接?


PS:发现了一些 与我非常相似的问题.

c# wcf networking tcp

7
推荐指数
1
解决办法
3133
查看次数

标签 统计

tcp ×2

wcf ×2

.net-4.0 ×1

c# ×1

networking ×1

sockets ×1