telnet连接到c#套接字不会关闭

时间:2010-11-04 07:49:01

标签: c# sockets telnet

我有一个基于c#套接字的服务器,它为TCP客户端提供服务。 我使用基于telnet的监控来查看服务器是否在监听。 通信客户端我使用服务器保持活着(发送随机字符串数据),如果套接字延长引发 - 我从客户端的字典中删除客户端。 问题是:与套接字的telnet连接不会从连接列表中删除,并且客户端数量正在缓慢但肯定地上升。 我尝试通过命令行手动telnet到服务器,而不是关闭telnet连接 - 什么。服务器只是继续发送保持活动到没有execptions的telnet连接。 这是我的回电话:

 protected void ReadCallback(IAsyncResult ar)
    {
        String content = String.Empty;
        // Retrieve the state object and the handler socket
        // from the async state object.
        StateObject state = (StateObject)ar.AsyncState;
        Socket handler = state.socket;
        if (state.socket == null)
            return;
        if (!state.socket.Connected)
            return;

        int id = state.id;
        try
        {
            // Read data from the client socket.
            int bytesRead = handler.EndReceive(ar);

            if (bytesRead > 0)
            {
                string newAddedStr = string.Empty;
                newAddedStr = Encoding.UTF8.GetString(state.buffer, 0, bytesRead);
                //cut the new message and add it 
                if (state.sb == null)
                    state.sb = new StringBuilder();
                    state.sb.Append(newAddedStr);
                // There might be more data, so store the data received so far.
                //add data until end of XML
                content = state.sb.ToString();
                //IF GOT FULL MESSAGE FROM SOCKET
                if ((content.Length > 0) /*&& (content.IndexOf("\0") > -1)*/)
                {
                    String strh = String.Format("Client # {0} data: ", id);
                    strh += content.Replace("\0", "");
                    if (!strh.Contains("keepalive"))
                        LogWriter.Trace(strh, "");
                    // l(writeToGetTextBoxMsg), new object[] { strh });
                    if (state != null)
                    {
                        if (state.sb == null)
                            state.sb = new StringBuilder();
                        state.sb.Length = 0;
                    }
                    //add the rest of the xml


                    string objData = content.Replace("\0", "");
                    string xmlData = objData.ToString();
                    try
                    {


                        if (xmlData.Contains("Unsubscribe"))
                        {
                            RemoveSubscriber(xmlData);
                        }
                        else
                        {
                            if (xmlData.Contains("Subscribe"))
                            {
                                if (!state.IsInitiated)
                                {
                                    state.Init();
                                    state.socketClient.OnSocketError += new SocketErrorHandler(socketClient_OnSocketError);
                                    state.socketClient.clientSocket = handler;
                                }
                                AddSubscriber(xmlData, state);
                            }

                        }
                        xmlData = null;
                        objData = null;
                        content = null;

                    }
                    catch (ArgumentOutOfRangeException ex)
                    {
                        LogWriter.Trace(newAddedStr,"ArgumentOutOfRangeException in ReadCallback");
                    }
                    catch (Exception ex)
                    {
                        LogWriter.TraceError(ex.Message + " " + ex.StackTrace + " " + newAddedStr);
                    }
                    #region oldCode

                    #endregion
                }
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(this.ReadCallback), state);
            }
        }
        catch (System.Net.Sockets.SocketException es)
        {
            closeSocket(state, false, "Execption:" + es.Message + "," + es.StackTrace);
            if (es.ErrorCode != 64)
            {
                LogWriter.Trace(string.Format("Socket Exception: {0}, {1}.", es.ErrorCode, es.ToString()), "");
            }
        }
        catch (Exception e)
        {
            closeSocket(state, false,"Execption:"+e.Message+","+e.StackTrace);
            if (e.GetType().FullName != "System.ObjectDisposedException")
            {
                Console.WriteLine("Exception: " + e.StackTrace);
                LogWriter.Trace("Exception Message: " + e.ToString() + e.StackTrace, "");
                Console.WriteLine("Exception Message: " + e.ToString());
                LogWriter.Trace("ReadCallback:" + e.Message + " " + e.StackTrace, "ERROR");
            }
        }
    }

任何想法?

1 个答案:

答案 0 :(得分:3)

当您读取套接字并返回0时,您知道连接的另一端已关闭。你在做吗?