Socket通讯的“System.Net.Sockets.SocketException (0x80004005)”问题

LonelyPause 2017-06-09 05:10:07
最近做了一个比较简单的SOCKET通讯的小程序,用于实现一个小功能。说白了就是接收数据,存入数据库。

但是在实际运行当中,却出现了一点问题,当程序运行一段时间(大约5个小时)后,就会报错:

System.Net.Sockets.SocketException (0x80004005): 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。
在 System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)

已经查了三四天了,毫无头绪!

依照网上说的进行注册表设置也设置了,依旧不能解决问题。

望大手指教一二!

下面放出出问题的代码
...全文
4529 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mrpanwei 2020-11-08
  • 打赏
  • 举报
回复
楼主解决了么
LonelyPause 2017-06-09
  • 打赏
  • 举报
回复
 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);
            }
        }
LonelyPause 2017-06-09
  • 打赏
  • 举报
回复
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); } }

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧