如果启动的进程打开,应用程序退出后Socket不会关闭

时间:2012-04-19 19:09:39

标签: c# .net sockets

我的C#.net应用程序目前执行以下操作(除其他外):

  1. 创建一个线程,在特定端口上打开套接字并等待指令。
  2. 消息进来,套接字线程读取消息并引发事件。
  3. 事件处理程序调用必要的函数来解析消息并执行必要的操作,例如,启动应用程序。
  4. 指定的外部“应用程序”以异步方式启动。
  5. 当我的应用程序重新启动但外部应用程序未关闭时,套接字似乎永远不会关闭。然后,当我尝试再次启动该端口上的通信时,我收到错误。但是,只要我关闭外部应用程序,我就可以在该端口上打开一个套接字。

    好像我的程序没有正常关闭。它应该在退出时杀死套接字,但是当外部进程正在运行时,套接字永远不会关闭。

    有什么想法吗?

4 个答案:

答案 0 :(得分:16)

这只是一个刺,因为我已经看到你如何开始外部过程。如果你正在创建一个Process对象,我的猜测是你没有设置:

ProcessStartInfo.UseShellExecute = true;

如果UseShellExecute设置为false,子进程将从父进程继承打开的套接字句柄。即使父应用程序已关闭,这也会使套接字保持打开状态。

答案 1 :(得分:1)

从我发现here我的怀疑可能会被证实,这是新进程从父进程继承句柄的情况,从而导致您的问题。

看起来您只需复制/粘贴该链接中的代码即可直接调用Windows CreateProcess API并设置标志,以便不继承句柄。

另一个单独的想法是编写一个中间启动程序,它接受命令行信息,然后启动然后退出。这种额外的间接可能会让您只需很少的努力即可获得所需的位置。

答案 2 :(得分:0)

您可以使用using关键字

解决此问题
using (Socket socket = new Socket()) {
//The code
}

其他应用程序是否完全使用套接字?

答案 3 :(得分:0)

第一件事是关闭应用程序时查看套接字状态。套接字可能处于TIME_WAIT状态,这意味着它将等待一段时间,以确保不会收到任何其他消息。你可以在这里阅读: http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/ 现在将根据套接字中的哪一个启动连接终止过程在套接字上生成TIME_WAIT状态。因此,如果由于某种原因,您的套接字在服务器站点中执行关闭操作,那么在服务器站点(在服务器的端口中),套接字将状态更改为TIME_WAIT,因此如果在套接字期间重新启动服务器应用程序,则在TIME_WAIT中新套接字将无法绑定到侦听端口,我认为这是您遇到的问题。