环境:framework4.5 vs2017 C#
问题:使用websocket-sharp-with-proxy-support实现本地websocket监听,正常情况下没有问题。当程序异常终断后,没有释放掉端口,程序重启后就不能再次监听改端口了,提示“通常每个套接字地址(协议/网络地址/端口)只允许使用一次””;_webServer = new WebSocketServer("ws://192.168.0.186:9528");  //开启监听9528端口
                _webServer.Log.Level = WebSocketSharp.LogLevel.Error;
                _webServer.WaitTime = TimeSpan.FromSeconds(20000);
                _webServer.AddWebSocketService<DevFoundationService>("/SPIFoundationServices", CreateFoundationService);         //传输服务
                _webServer.AddWebSocketService<DevHeartbeatService>("/SPIConnectHeartbeat", CreateHeartbeatService);             //心跳服务
                _webServer.Start();尝试使用端口杀进程的方式,使用“netstat -ano”发现端口仍然被占用,但系统中找不到PID为9040的进程请问大家有什么方法?

解决方案 »

  1.   

    异常不能用try catch 捕捉吗?在finally 中关闭掉如何?
      

  2.   


    C#中不知道有没有对所有tcp端口的管理功能?想在启动后先关闭后重新监听该端口?
      

  3.   

    这应该是你的“websocket-sharp-with-proxy-support”的 bug,你可以找他们的维护人员反映,或者换别的组件库。
      

  4.   


    我们使用 .net 正规类库的任何功能都没有这毛病。你应该扔掉那种垃圾的“调用非托管库”的东西,或者你要求它们提高质量。
      

  5.   

    但系统中找不到PID为9040的进程?
    你找了吗?
    tasklist | findstr "9528" 是查找进程号为 9528 的进程!
      

  6.   


    试过了,没有这个进程。所以想通过杀进程的方式行不通我们使用 .net 正规类库的任何功能都没有这毛病。你应该扔掉那种垃圾的“调用非托管库”的东西,或者你要求它们提高质量。这个比如在资源管理器中强行关闭程序,也会出现。
    这个东西是之前的人写的,已经用的很多了,不是很好重写。
      

  7.   

    你要找的是 9040 而不是 9528
    9040 不可能不存在,你那是查出来的。不然 netstat 骗你干嘛!
      

  8.   


    这个只是截图截错了,但实际是真的没有找到,不管是用cmd中输tasklist,还是C#中编程找,还是在资源管理器中找,都没有找到。
      

  9.   

    你可以使用开源的 Fleck 项目作为 websocket server。关闭进程那么服务端口就应该自动释放了。这才是正常的、有用的类库。
      

  10.   

    WebSocketSharp 库
    停止流程:
    1.判断Server是否为空。
    2.调用Stop()
    3.Server = null