服务端应用程序关闭后,socket连接不释放?
你好:我把我的服务端程序关闭后,由这个程序创建的socket连接并未释放。
这是我关闭服务端程序后 机器上的截图
系统:Server2003 服务端程序:.net C#
请问各位是什么原因导致这个问题?
socket .NET --------------------编程问答-------------------- 几分钟都不释放,也是正常的。这没有什么。只要不影响使用即可,你可以把它看作提高效率的缓冲设计。 --------------------编程问答--------------------
是一直不释放,从发现问题,找资料到发帖 已经一两个小时了。
之前也是同样的情况,除非重启操作系统。 --------------------编程问答-------------------- 服务器做的负载均衡, 外面连接进来,有台机器进行连接分配(连接分配这块不是自己弄)将连接转到我的服务端。一共有16台虚拟主机,每台上面跑30个服务端,9001-9030端口。 --------------------编程问答-------------------- 在程序运行的时候这些连接也未释放。这样就导致,进行负载均衡的机器会误认为当前服务端已经有这么多连接,就会拒绝新的连接了。
现在问题是为什么程序关闭后这些连接都未释放?? --------------------编程问答-------------------- UP 关注... 怎么没人回复? --------------------编程问答-------------------- UP --------------------编程问答-------------------- http://www.2cto.com/net/201208/149364.html --------------------编程问答--------------------
嗯,问题的关键就是:当我的服务端程序关闭程序时,这个状态(FIN_WAIT_2)的连接还一直存在着。
这是我服务端程序一段代码:
Socket clientSocket = ServerSocket.Accept();//接收侦听
if (clientSocket.Connected)
{
if (WorkService.currentUserCount + 1 > MAX_COUNT)//如果超过最大连接数则关闭Socket
{
#region
clientSocket.Send(Encoding.BigEndianUnicode.GetBytes(ResultCode.WLLJSB));
clientSocket.Close();
#endregion
}
else
{
#region
byte[] buffer = new byte[1024];
////以下六句比较关键,通过这几句可以用来侦听客户端的意外掉线
uint dummy = 0;
byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);//开启发送心跳包
BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));//5秒后开始发送心跳包
BitConverter.GetBytes((uint)3000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);//每隔3秒就发送心跳包
clientSocket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
//如果客户端在30分钟内没有跟服务器进行任何通信,则服务器关闭与客户端的连接
//accsock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1200000);
//clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1800000);
clientSocket.Receive(buffer, 0, 1024, SocketFlags.None);
string RecMessage = System.Text.Encoding.BigEndianUnicode.GetString(buffer);
RecMessage = RecMessage.Trim("\0".ToCharArray());
补充:.NET技术 , C#