windows下进程退出端口仍在

本文介绍了一种常见的情况,即启动Socket服务时遇到端口被占用的问题,并详细解释了问题产生的原因。通常是因为父进程拉起子进程时设置了句柄继承,导致服务重启时端口仍被占用。文章给出了具体的解决办法,通过修改CreateProcess中的参数或者在创建Socket后调用SetHandleInformation来禁用句柄继承。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象:拉起进程创建Socket服务时出错,错误原因是端口被占用,OK,这个简单,你使用

netstat -ano | find "端口号"

终于,你发现某一个PID的进程占用了这个端口,心想,找到对应的PID的进程杀掉即可,但是当你按上面提示的PID到设备管理器里面去找时却发现没有对应PID的进程在运行,怎么回事?

一般这种情况都是起Socket端口的进程又拉起了子进程,且在拉起子进程的时候直接或间接调用CreateProcess时候继承设置为TRUE,然后服务进程退出了,子进程没有退出,再启服务进程的时候就会报端口被占用。

BOOL WINAPI CreateProcess(
  _In_opt_    LPCTSTR               lpApplicationName,
  _Inout_opt_ LPTSTR                lpCommandLine,
  _In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes,
  _In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_        BOOL                  bInheritHandles,   // 此处设置了TRUE
  _In_        DWORD                 dwCreationFlags,
  _In_opt_    LPVOID                lpEnvironment,
  _In_opt_    LPCTSTR               lpCurrentDirectory,
  _In_        LPSTARTUPINFO         lpStartupInfo,
  _Out_       LPPROCESS_INFORMATION lpProcessInformation
);

当然你可以把上面的TRUE改为FALSE,但有时候可能这个参数需要设置为TRUE,怎么办呢?解决方法也很简单,在创建Socket时,bind端口之后,调用SetHandleInformation

// 关闭Socket句柄继承
SetHandleInformation((HANDLE)socket, HANDLE_FLAG_INHERIT, 0 );

问题解决,以后服务进程退出了端口也就会被释放。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值