当前位置:编程学习 > C#/ASP.NET >>

服务端应用程序关闭后,socket连接不释放?


你好:我把我的服务端程序关闭后,由这个程序创建的socket连接并未释放。
这是我关闭服务端程序后 机器上的截图


系统:Server2003   服务端程序:.net  C#
请问各位是什么原因导致这个问题?


socket .NET --------------------编程问答-------------------- 几分钟都不释放,也是正常的。这没有什么。只要不影响使用即可,你可以把它看作提高效率的缓冲设计。 --------------------编程问答--------------------
引用 1 楼 sp1234 的回复:
几分钟都不释放,也是正常的。这没有什么。只要不影响使用即可,你可以把它看作提高效率的缓冲设计。

是一直不释放,从发现问题,找资料到发帖 已经一两个小时了。
之前也是同样的情况,除非重启操作系统。 --------------------编程问答-------------------- 服务器做的负载均衡, 外面连接进来,有台机器进行连接分配(连接分配这块不是自己弄)将连接转到我的服务端。一共有16台虚拟主机,每台上面跑30个服务端,9001-9030端口。 --------------------编程问答-------------------- 在程序运行的时候这些连接也未释放。这样就导致,进行负载均衡的机器会误认为当前服务端已经有这么多连接,就会拒绝新的连接了。
现在问题是为什么程序关闭后这些连接都未释放?? --------------------编程问答-------------------- UP  关注... 怎么没人回复? --------------------编程问答-------------------- UP  --------------------编程问答-------------------- http://www.2cto.com/net/201208/149364.html --------------------编程问答--------------------
引用 7 楼 qq752923276 的回复:
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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,