Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
到c#套接字的telnet连接不';关不上_C#_Sockets_Telnet - Fatal编程技术网

到c#套接字的telnet连接不';关不上

到c#套接字的telnet连接不';关不上,c#,sockets,telnet,C#,Sockets,Telnet,我有一个基于c#套接字的服务器,它为TCP客户端提供服务。 我使用基于telnet的监视来查看服务器是否正在侦听。 要对客户端进行版本化,我使用服务器保持活动(发送随机字符串数据),如果出现套接字预期,我将从客户端字典中删除客户端。 问题是:到套接字的telnet连接没有从连接列表中删除,客户端的数量正在缓慢但肯定地上升。 我尝试通过命令行手动将telnet连接到服务器,然后关闭telnet连接—什么都没有。服务器只会继续将keep alive发送到telnet连接,而不执行任何操作。 这是我的

我有一个基于c#套接字的服务器,它为TCP客户端提供服务。 我使用基于telnet的监视来查看服务器是否正在侦听。 要对客户端进行版本化,我使用服务器保持活动(发送随机字符串数据),如果出现套接字预期,我将从客户端字典中删除客户端。 问题是:到套接字的telnet连接没有从连接列表中删除,客户端的数量正在缓慢但肯定地上升。 我尝试通过命令行手动将telnet连接到服务器,然后关闭telnet连接—什么都没有。服务器只会继续将keep alive发送到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");
            }
        }
    }

有什么想法吗?

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

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

没有。我已将我的阅读回访添加到问题中。通常,当服务保持活动失败时,我会关闭套接字。当读取0字节时关闭连接的意义是什么?为什么不从服务器保持活动状态?从读取调用读取0字节时关闭可避免使用保持活动状态。请记住,如果您没有设计自己的协议,您将无法在大多数时间发送keep alive。不要依赖TCP保持活动,因为它们是可选的,并且没有被广泛使用。我已将我的阅读回复添加到问题中。通常,当服务保持活动失败时,我会关闭套接字。当读取0字节时关闭连接的意义是什么?为什么不从服务器保持活动状态?从读取调用读取0字节时关闭可避免使用保持活动状态。请记住,如果您没有设计自己的协议,您将无法在大多数时间发送keep alive。不要依赖TCP keep alive,因为它们是可选的,并且没有被广泛使用。如果在服务器计算机和客户端计算机上进行netstat,连接是否仍然设置为已建立?我不太明白答案中的含义。我在netstat方面有点弱。我运行netstat时,它似乎仍然建立。如果它仍然在客户端和服务器上建立,则都没有对套接字执行关闭。您是否完全确定任何一方确实执行了关闭?我已关闭telnet窗口(cmd),并尝试在telnet上执行退出命令。我确信即使没有netstat,它仍然可以建立,因为从服务器套接字发送数据没有失败。如果在服务器计算机和客户端计算机上进行netstat,连接是否仍然设置为已建立?我不太明白答案中的意思。我在netstat方面有点弱。我运行netstat时,它似乎仍然建立。如果它仍然在客户端和服务器上建立,则都没有对套接字执行关闭。您是否完全确定任何一方确实执行了关闭?我已关闭telnet窗口(cmd),并尝试在telnet上执行退出命令。我确信即使没有netstat,它仍然可以建立,因为从服务器套接字发送数据并没有失败。