线程完成后,为何还有很多端口不能释放
编号:QA002154
建立日期: 1999年12月3日 最后修改日期:1999年12月3日
所属类别:
Sowin.Li:
操作系统:Windows98
编程工具:VC++/C++ Builder
问题:用CreateThread生成多个Socket连接。线程完成后,相应的Socket已经用closesocket()关闭,为何用netstat命令检查,还有很多端口不能释放,状态是FIN_WAIT2或CLOSE_WAIT。而我的数据已经确保传送完成。当我将服务端程序关闭后,再用netstat命令检查就不会看到那些端口。为什么端口不能释放?
回答:
我已经搞定这个问题了:
由于第一次在WINDOWS里用CreateThread(),我只是让系统隐含调用ExitThread()来释放资源,但还没有在线程退出时调用CloseHandle()释放由CreateThread()生成的句柄,同时在我的程序里有一个BUG--相应的出错处理没有增加closesocket()。
结构如下:
void foo()
{
do{
th = CreateThread(.., WINAPI MyThreadProc, ..);
if(th){
closeHandle(th);
}
.....
}
.....
}
WINPAI MyThreadProc(...)
{
if(send(...) == SOCKET_ERROR){
closesocket(mysock);
OnErrorOccur(...);
}
......
}
此问题由Sowin.Li回答。
| |
|
|
| |
|
|