gpt4 book ai didi

c# - 生成过程将保留在套接字端口上。如何防止它这样做?

转载 作者:行者123 更新时间:2023-12-03 11:53:16 35 4
gpt4 key购买 nike

为了简化起见,我正在编写一个名为“APPLICATION A”的程序,该程序打开了到本地主机上端口8881的套接字连接;稍后,它会使用代码打击生成一个名为“APPLICATION B”的exe应用程序:

        try
{
XmSam.Log("Spawning (" + process + ")");

ProcessEx proc = new ProcessEx();

proc.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + process + ".exe";
proc.StartInfo.Arguments = parameters;
proc.StartInfo.UseShellExecute = false;
proc.Start();

Program.Processes.Add(proc);

XmSam.Log("Spawned " + proc.ProcessName);
}
catch (Exception ex)
{
XmSam.Log(ex);
}

当我关闭应用程序A(通过停止应用程序或在窗口任务管理器中终止它的进程)时,应用程序B仍在运行,这很好。但是,当我再次启动APPLICATION A时,出现了异常:
2012-10-18 16:21:23 - Only one usage of each socket address (protocol/network address/port) is normally permitted
2012-10-18 16:21:23 - at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)

当应用程序A尝试打开端口8881的套接字时,会发生此错误。如果我杀死应用程序B,此错误将消失。我不认为这是由于应用程序B代码所致,因为它没有任何内容,如以下代码所示:
    [STAThread]
static void Main()
{
while (true)
{
}
}

我试图在Process类下查看MSDN,但是对此却一无所获。我假设当您生成一个进程时,该进程是独立于调用应用程序的,但是显然并非如此。您是否知道让我在不保留调用应用程序的情况下生成进程的任何设置?

我知道另一种方法是在应用程序A中使用代码杀死应用程序B,但是这不是一种理想的解决方案,尤其是在应用程序A意外崩溃的情况下。

谢谢你。

最佳答案

经过更多挖掘,我找到了答案。我发现这个很棒的article

其中,对该问题的主要解释如下:

System.Diagnostics.Process.Start causes the child process to inherit handles from the parent process. That means, whatever process you spawn (e.g. Internet Explorer), that process gets all of the handles owned by your process! So even if you free up handles in your process, if the process you spawned is still running, your handles won’t really be freed because the child process is supposedly using them.



因此,我所要做的就是将UseShellExecute标志更新为true。
proc.StartInfo.UseShellExecute = true;

关于c# - 生成过程将保留在套接字端口上。如何防止它这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12975260/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com