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