各位大佬,接收的socket服務出現記憶體溢位,求助!!
類似以下結構,服務啟動時HandleAcceptConnected開始處理,HandleDataReceived異步處理,現在服務啟動后隨著時間累積,占用記憶體逐漸上升,各位大佬幫忙看下,在線等~
以下是原始碼:
/// <summary>
/// 啟動服務器
/// </summary>
/// <returns>異步TCP服務器</returns>
public SocketModuleAsyncServer Start()
{
if (!IsRunning)
{
IsRunning = true;
_serverSocket.IOControl(IOControlCode.KeepAliveValues, KeepAliveTime, null);
_serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
_serverSocket.Bind(new IPEndPoint(this.Address, this.Port));
_serverSocket.Listen(_maxClient);
_serverSocket.BeginAccept(new AsyncCallback(HandleAcceptConnected), _serverSocket);
}
return this;
}
/// <summary>
/// 處理客戶端連接--> 一個客戶端已連接
/// </summary>
/// <param name="ar"></param>
private void HandleAcceptConnected(IAsyncResult ar)
{
if (IsRunning)
{
Socket server = null;
Socket client = null;
try
{
server = (Socket)ar.AsyncState;
client = server.EndAccept(ar);
}
catch (Exception ex)
{
server.BeginAccept(new AsyncCallback(HandleAcceptConnected), ar.AsyncState);
}
if (client != null && client.Connected)
{
//檢查是否達到最大的允許的客戶端數目
if (_clientCount > _maxClient)
{
//TODO 觸發事件
RaiseServerException("");
}
else
{
try
{
Session session = new Session(client);
if (session != null)
{
RaiseClientConnected(session); //觸發客戶端連接事件
session.RecvDataBuffer = new byte[client.ReceiveBufferSize];
//開始異步接受來自該客戶端的資料
client.BeginReceive(session.RecvDataBuffer, 0, session.RecvDataBuffer.Length, SocketFlags.None, new AsyncCallback(HandleDataReceived), session);
_clientCount++;
}
}
catch (Exception)
{
}
}
try
{
//接受下一個客戶端的請求
server.BeginAccept(new AsyncCallback(HandleAcceptConnected), ar.AsyncState);
}
catch (Exception)
{
throw;
}
}
}
}
/// <summary>
/// 處理客戶端資料--> 收到一個客戶端的訊息
/// </summary>
/// <param name="ar"></param>
private void HandleDataReceived(IAsyncResult ar)
{
if (IsRunning)
{
Session session = (Session)ar.AsyncState;
Socket client = session.ClientSocket;
string content = string.Empty;
try
{
if (client == null || !client.Connected)
{
CloseSession(session);
RaiseNetError(session);//觸發網路錯誤事件
return;
}
int recv = client.EndReceive(ar);
if (recv == 0)
{
CloseSession(session);
RaiseNetError(session);//觸發網路錯誤事件
return;
}
//業務處理
}
catch (SocketException)
{
RaiseNetError(session);//觸發網路錯誤事件
}
finally
{
if (session.RecvDataBuffer != null)
{
try
{
//繼續接收來自來客戶端的資料
client.BeginReceive(session.RecvDataBuffer, 0, session.RecvDataBuffer.Length, SocketFlags.None, new AsyncCallback(HandleDataReceived), session);
}
catch (Exception)
{
CloseSession(session);
}
}
}
}
}
uj5u.com熱心網友回復:
不想說了。說多了,又得有人說俺們教訓新人了https://github.com/rsocket/rsocket-net/tree/master/RSocket.Core/Transports
這份代碼自己看把,
https://github.com/mgravell/Pipelines.Sockets.Unofficial
這個也可以看看
東西就那么些東西,要說名詞 “pipeline,異步,記憶體池,span<T>,system.buffer下那一堆東西”,關鍵是你自己能領會到
uj5u.com熱心網友回復:
直接貼報錯提示。uj5u.com熱心網友回復:
OutOfMemory
uj5u.com熱心網友回復:
做一下連接狀態判斷,這樣會好很多uj5u.com熱心網友回復:
這代碼是自己寫的,還是從網上找的?邏輯上有問題。在 catch 里居然還想要執行重要的代碼?轉載請註明出處,本文鏈接:https://www.uj5u.com/net/252352.html
標籤:C#
上一篇:sql轉linq
