最近在写一个远程调试器,其中服务端负责启动被调试程序,同时将被调试程序的数据通过socket连接和客户端通信,客户端是一个界面展示程序。简单描述如下:
1客户端 -> 2服务端->3被调试程序
理想的情况是,当2服务端进程被关掉时,1和2之间的socket连接应该要断开,并且socket资源归还给操作系统。但是在测试中发现服务端进程关掉后,1和2之间的socket连接仍然存,用netstate查看
netstat -ano|findstr 9527
TCP 0.0.0.0:9527 0.0.0.0:0 LISTENING 22460
TCP 127.0.0.1:9527 127.0.0.1:51416 ESTABLISHED 22460
TCP 127.0.0.1:51416 127.0.0.1:9527 ESTABLISHED 12920
pid 22460的进程明明已经被杀掉了,为什么它分配的socket还在呢?它和客户端的连接仍然没有断开?
查了资料后,发现,原来 服务端进程在调用CreateProcess 创建被调试的子进程的时候,它的bInheritHandle参数用了true,将会导致子进程继承了它的socket资源,这样,即使服务端进程结束后,socket资源仍然会被调试进程所持有,这样就无法释放socket资源了。
WINBASEAPI
BOOL
WINAPI
CreateProcessA(
_In_opt_ LPCSTR lpApplicationName,
_Inout_opt_ LPSTR lpCom