最近做了一個比較簡單的SOCKET通訊的小程式,用于實作一個小功能。說白了就是接收資料,存入資料庫。
但是在實際運行當中,卻出現了一點問題,當程式運行一段時間(大約5個小時)后,就會報錯:
System.Net.Sockets.SocketException (0x80004005): 由于系統緩沖區空間不足或佇列已滿,不能執行套接字上的操作。
在 System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
已經查了三四天了,毫無頭緒!
依照網上說的進行注冊表設定也設定了,依舊不能解決問題。
望大手指教一二!
下面放出出問題的代碼
uj5u.com熱心網友回復:
public SocketManager(string ip, int port)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress _ip = IPAddress.Parse(ip);
_endPoint = new IPEndPoint(_ip, port);
_listSocketInfo = new Dictionary<string, SocketInfo>();
_DeviceInfo = new Dictionary<string, string>();
}
public void Start()
{
_socket.Bind(_endPoint); //系結埠
_socket.Listen(50); //開啟監聽
Thread acceptServer = new Thread(AcceptWork); //開啟新執行緒處理監聽
acceptServer.IsBackground = true;
_isListening = true;
acceptServer.Start();
}
public void AcceptWork()
{
while (_isListening)
{
Socket acceptSocket = _socket.Accept();
if (acceptSocket != null && this.OnConnected != null)
{
SocketInfo sInfo = new SocketInfo();
sInfo.socket = acceptSocket;
if (!_listSocketInfo.Keys.Contains(acceptSocket.RemoteEndPoint.ToString()))
{
_listSocketInfo.Add(acceptSocket.RemoteEndPoint.ToString(), sInfo);
}
else
{ //釋放上一次建立的鏈接,重新系結
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].isConnected = false;
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].socket.Shutdown(SocketShutdown.Both);
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].socket.Close();
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()] = sInfo;
}
OnConnected(acceptSocket.RemoteEndPoint.ToString());
Thread socketConnectedThread = new Thread(newSocketReceive);
socketConnectedThread.IsBackground = true;
socketConnectedThread.Start(acceptSocket);
}
Thread.Sleep(1000);
}
}
public void newSocketReceive(object obj)
{
Socket socket = obj as Socket;
string EndPoint = socket.RemoteEndPoint.ToString();
SocketInfo sInfo = _listSocketInfo[EndPoint];
sInfo.isConnected = true;
while (sInfo.isConnected)
{
try
{
if (sInfo.socket == null || !sInfo.socket.Connected)
{
LogHelper.WriteDebug("socket=null ip=" + EndPoint);
sInfo.isConnected = false;
if (_listSocketInfo.ContainsKey(EndPoint))
{
_listSocketInfo.Remove(EndPoint);
}
sInfo.socket.Shutdown(SocketShutdown.Both);
sInfo.socket.Close();
return;
}
//這里向系統投遞一個接收資訊的請求,并為其指定ReceiveCallBack做為回呼函式
sInfo.socket.BeginReceive(sInfo.buffer, 0, sInfo.buffer.Length, SocketFlags.None, ReceiveCallBack, sInfo.socket.RemoteEndPoint);
}
catch (Exception ex)
{
LogHelper.WriteDebug("【Exception】 Method=newSocketReceive || Exception=" + ex.ToString());
sInfo.isConnected = false;
if (_listSocketInfo.ContainsKey(sInfo.socket.RemoteEndPoint.ToString()))
{
_listSocketInfo.Remove(sInfo.socket.RemoteEndPoint.ToString());
}
var index = "";
foreach (var item in _DeviceInfo)
{
if (item.Value == sInfo.socket.RemoteEndPoint.ToString())
{
index = item.Key;
_DeviceInfo.Remove(index);
break;
}
}
sInfo.socket.Shutdown(SocketShutdown.Both);
sInfo.socket.Close();
return;
}
Thread.Sleep(1000);
}
}
uj5u.com熱心網友回復:
public SocketManager(string ip, int port)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress _ip = IPAddress.Parse(ip);
_endPoint = new IPEndPoint(_ip, port);
_listSocketInfo = new Dictionary<string, SocketInfo>();
_DeviceInfo = new Dictionary<string, string>();
}
public void Start()
{
_socket.Bind(_endPoint); //系結埠
_socket.Listen(50); //開啟監聽
Thread acceptServer = new Thread(AcceptWork); //開啟新執行緒處理監聽
acceptServer.IsBackground = true;
_isListening = true;
acceptServer.Start();
}
public void AcceptWork()
{
while (_isListening)
{
Socket acceptSocket = _socket.Accept();
if (acceptSocket != null && this.OnConnected != null)
{
SocketInfo sInfo = new SocketInfo();
sInfo.socket = acceptSocket;
if (!_listSocketInfo.Keys.Contains(acceptSocket.RemoteEndPoint.ToString()))
{
_listSocketInfo.Add(acceptSocket.RemoteEndPoint.ToString(), sInfo);
}
else
{ //釋放上一次建立的鏈接,重新系結
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].isConnected = false;
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].socket.Shutdown(SocketShutdown.Both);
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].socket.Close();
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()] = sInfo;
}
OnConnected(acceptSocket.RemoteEndPoint.ToString());
Thread socketConnectedThread = new Thread(newSocketReceive);
socketConnectedThread.IsBackground = true;
socketConnectedThread.Start(acceptSocket);
}
Thread.Sleep(1000);
}
}
public void newSocketReceive(object obj)
{
Socket socket = obj as Socket;
string EndPoint = socket.RemoteEndPoint.ToString();
SocketInfo sInfo = _listSocketInfo[EndPoint];
sInfo.isConnected = true;
while (sInfo.isConnected)
{
try
{
if (sInfo.socket == null || !sInfo.socket.Connected)
{
LogHelper.WriteDebug("socket=null ip=" + EndPoint);
sInfo.isConnected = false;
if (_listSocketInfo.ContainsKey(EndPoint))
{
_listSocketInfo.Remove(EndPoint);
}
sInfo.socket.Shutdown(SocketShutdown.Both);
sInfo.socket.Close();
return;
}
//這里向系統投遞一個接收資訊的請求,并為其指定ReceiveCallBack做為回呼函式
sInfo.socket.BeginReceive(sInfo.buffer, 0, sInfo.buffer.Length, SocketFlags.None, ReceiveCallBack, sInfo.socket.RemoteEndPoint);
}
catch (Exception ex)
{
LogHelper.WriteDebug("【Exception】 Method=newSocketReceive || Exception=" + ex.ToString());
sInfo.isConnected = false;
if (_listSocketInfo.ContainsKey(sInfo.socket.RemoteEndPoint.ToString()))
{
_listSocketInfo.Remove(sInfo.socket.RemoteEndPoint.ToString());
}
var index = "";
foreach (var item in _DeviceInfo)
{
if (item.Value == sInfo.socket.RemoteEndPoint.ToString())
{
index = item.Key;
_DeviceInfo.Remove(index);
break;
}
}
sInfo.socket.Shutdown(SocketShutdown.Both);
sInfo.socket.Close();
return;
}
Thread.Sleep(1000);
}
}
uj5u.com熱心網友回復:
樓主解決了么轉載請註明出處,本文鏈接:https://www.uj5u.com/net/207446.html
標籤:C#
上一篇:linq請教
下一篇:vs2019中編輯水晶報表問題
