我使用ACE库做了一个AIO方面的程序,有的时候,当进程已经退出,用netstat看网络状态,发现端口仍然处于Listen状态。
例如:
netstat -anop TCP
获得一个列表,显示PID是1000(假设)的进程正在Listen某个端口(比如2000号端口)
而实际上,进程早已退出,用任务管理器看也看不到1000号进程。
奇怪的是用telnet xxx.xxx.xxx.xxx 2000
却可以连接到这个看不到的进程里。
结果导致我无法再次启动这个进程,因为端口已经处于Listen状态,我无法再次去绑定它
我已经设置了SO_REUSEADDR来防止套接字TIME_WAIT状态下的进程无法再次启动问题,可是套接字居然处于Listen状态,实在是奇怪。
注:
当进程退出的时候已经关闭了套接字,并且是正常关闭,关闭过程也没有出现问题
例如:
netstat -anop TCP
获得一个列表,显示PID是1000(假设)的进程正在Listen某个端口(比如2000号端口)
而实际上,进程早已退出,用任务管理器看也看不到1000号进程。
奇怪的是用telnet xxx.xxx.xxx.xxx 2000
却可以连接到这个看不到的进程里。
结果导致我无法再次启动这个进程,因为端口已经处于Listen状态,我无法再次去绑定它
我已经设置了SO_REUSEADDR来防止套接字TIME_WAIT状态下的进程无法再次启动问题,可是套接字居然处于Listen状态,实在是奇怪。
注:
当进程退出的时候已经关闭了套接字,并且是正常关闭,关闭过程也没有出现问题
或者可能是要等一下系统才关闭你的socket.
Listen状态并持续很久,当然这样的情况偶然才会发生,而且从不在调试器中发生,郁闷死了
贴点代码啊,注释太少了,不好判断,我猜的:
Listen的那个socket,正常关闭是不是成功关闭呢?WSAGetLastError()
ACE_OS::shutdown (handle (), SD_BOTH);
ACE_OS::closesocket (handle ());相当于
socket sock;
...
...
shutdown (sock);
closesocket (sock);其实我感到无法解决的是我的进程已经退出了,我即便检查到closesocket的错误,我也拿它没有办法。
我看到的例子都是只关闭accept之后的socket,即用于I/O读写的那个socket,那个用于被动等待连接的socket似乎没有看过关闭它的例子
closesocket这个函数会被其他代码干扰吗?我确实调用了,得到的结果却不稳定,奇怪
我用.net 开发的数据库程序也是这样的,通过网络连接到SQL Server,我已经关闭连接后SQL Server还是会等待一段时间才关闭,不然你可以测试,看是不是过一段时间后他会自动关闭~~
一般来讲,用于通讯的数据socket将在closesocket后稍后才关闭(估计为了保障半连接特性),但用于监听的端口也在closesocket后不关闭,那我的麻烦就大了
PMIB_TCPROW pTcpRow // pointer to struct. with new state info
);
该函数是删除可疑TCP连接的,不知道你想怎么用他,难道客户端建立一个连接你删掉一个?
但我调SetTcpEntry永远返回87号错误。
编写一个单独的应用程序去关闭端口,得到的结果是一样的