1

Visual Studio C# 2010 と SQL SERVER を使用して、クライアント サーバー ソケット プログラミングに取り組んでいます。

プログラムは正常に動作します。しかし、しばらくするとエラーが発生します

"System out of memory exception"

ここでは、ソケット パケット クラスを使用します。

 public class SocketPacket
 {
        public SocketPacket(System.Net.Sockets.Socket socket, int clientNumber, string ClientIP)
        {
            m_currentSocket = socket;
            m_clientNumber = clientNumber;
            m_ClientIP = ClientIP;
        }
        public System.Net.Sockets.Socket m_currentSocket;
        public int m_clientNumber;
        public byte[] dataBuffer = new byte[10000000];
        public string m_ClientIP;
    }

dataBuffer がいっぱいになると思います

dataBuffer を解放するには?

4

2 に答える 2

2

あなたのクラスには、インターフェイスを実装するSocketPacketタイプのフィールドが含まれています。このため、クラスのインスタンスを手動で破棄する必要があります。また、クラスに IDisposible を実装することをお勧めします。System.Net.Sockets.SocketIDisposibleSocketPacket

    public class SocketPacket: IDisposable
    {
        public SocketPacket(System.Net.Sockets.Socket socket, int clientNumber, string ClientIP)
        {
            m_currentSocket = socket;
            m_clientNumber = clientNumber;
            m_ClientIP = ClientIP;
        }
        public System.Net.Sockets.Socket m_currentSocket;
        public int m_clientNumber;
        public byte[] dataBuffer = new byte[10000000];
        public string m_ClientIP;
        public void Dispose()
        {
            m_currentSocket.Dispose();
        }
    }
于 2012-08-08T05:24:40.733 に答える
0

IDisposable を正しく実装する方法については、MSDN レポートを確認してください。これで問題が解決する場合があります。http://msdn.microsoft.com/en-us/library/ms244737(v=vs.80).aspx

編集: さらに調査した結果、C# タイプの Socket も IDisposable を実装しているため、Socket オブジェクトの使用の周りで using() ブロックを使用してみてください。これにより、Socket オブジェクトが正しくクリーンアップされます。

于 2012-08-08T07:24:36.407 に答える