现象:拉起进程创建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 );
问题解决,以后服务进程退出了端口也就会被释放。