我在 .net compact framework 3.5(控制台应用程序)中编写异步 TCP 服务器,我只使用套接字类,因为 TcpListener 不支持 .netCF。我使用了与 msdn ( http://msdn.microsoft.com/en-us/library/fx6588te(v=vs.90).aspx) 中相同的服务器代码。但是 2/3 天后我的系统挂起,我的系统是 ARM 设备,有 64 MB RAM。可能的原因是什么。我在同步 TCP 服务器中没有遇到这样的问题。 这是我的代码。
public void StartListening()
{
try
{
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8001);
// Create a TCP/IP socket.
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Bind the socket to the local endpoint and listen for incoming connections.
listener.Bind(localEndPoint);
listener.Listen(4);
while (true)
{
try
{
// Start an asynchronous socket to listen for connections.
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
// Wait until a connection is made before continuing.
allDone.WaitOne();
}
catch (Exception pEx)
{
_serverLog.WriteFile(pEx);
}
}
}
catch (Exception pEx)
{
_serverLog.WriteFile(pEx);
}
}
/// <summary>
///
/// </summary>
/// <param name="ar"></param>
public void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
//listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
//listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
}
/// <summary>
///
/// </summary>
public void ReadCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
string localIP = handler.RemoteEndPoint.ToString();
var _port = localIP.Split(':');
string _ip = _port[0] + ":" + _port[1];
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
_receivedData.Enqueue(state.sb.ToString());
Send(handler, " - ACK - Data Received.");
//ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessData), _ip);
this.ProcessData(_ip);
}
}
/// <summary>
///
/// </summary>
/// <param name="handler"></param>
/// <param name="data"></param>
private void Send(Socket handler, String data)
{
// Convert the string data to byte data using ASCII encoding.
byte[] byteData = Encoding.ASCII.GetBytes(data);
// Begin sending the data to the remote device.
handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);
}
/// <summary>
///
/// </summary>
/// <param name="ar"></param>
private void SendCallback(IAsyncResult ar)
{
try
{
// Retrieve the socket from the state object.
Socket handler = (Socket)ar.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
catch (Exception pEx)
{
_serverLog.WriteFile(pEx);
}
}
最佳答案
也许它在您尚未在此处发布的部分中,但我在任何地方都看不到您清空 StringBuffer state.sb
的代码或队列 _receivedData
(只是通过名称/方法假设类型)。填充这两个资源可能会使您的系统挂起,因为在某些时候没有更多的内存...
关于c# - .NET Compact 框架中的异步 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18606116/