Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 套接字接收不释放缓冲区(字节数组)_C#_Sockets_Memory Leaks_Tcplistener - Fatal编程技术网

C# 套接字接收不释放缓冲区(字节数组)

C# 套接字接收不释放缓冲区(字节数组),c#,sockets,memory-leaks,tcplistener,C#,Sockets,Memory Leaks,Tcplistener,我现在正在开发一个服务,它监听TCP协议中的消息,并将它们发送到不同的目的地 所以我定义了一个套接字,它一直保持打开状态并获取消息。协议的大小是静态的,消息一次到达几个 只要接收到值,循环就会运行,并减少消息的匹配大小 该服务运行良好-所有消息都会根据需要接收,但内存会不断增加。 实施: public void WaitingForClient() { while (true) { // Accept will block until someone connec

我现在正在开发一个服务,它监听TCP协议中的消息,并将它们发送到不同的目的地

所以我定义了一个套接字,它一直保持打开状态并获取消息。协议的大小是静态的,消息一次到达几个

只要接收到值,循环就会运行,并减少消息的匹配大小

该服务运行良好-所有消息都会根据需要接收,但内存会不断增加。 实施:

public void WaitingForClient()
{
    while (true)
    {
        // Accept will block until someone connects
        m_Socket = m_TcpLsn.AcceptSocket();
        ThreadPool.QueueUserWorkItem(new WaitCallback(ReadSocket));
    }
}

//Read the data from the socket
public void ReadSocket(object obj)
{
    Socket s = m_Socket;

    if (s.Connected)
    {
        Byte[] receive = new Byte[MESSAGE_LENGTH];
        try
        {
            // Receive will block until data coming
            // ret is 0 or Exception happen when Socket connection is broken
            int ret = s.Receive(receive, receive.Length, 0);
            while (ret > 0)
            {
                OnMessageRecieved(new RecievedMessage(receive));
                **receive = new Byte[MESSAGE_LENGTH];**
                ret = s.Receive(receive, receive.Length, SocketFlags.None);
            }
        }
我在NetMemoryProfiler中看到,缓冲区(循环中定义的字节数组)永远不会被释放,因此存在内存泄漏问题。在每次发送消息时,都会创建另一个字节数组实例&不会释放任何内容

我尝试编写一个循环,以这种方式初始化空数组:

try
{
    // Receive will block until data coming
    // ret is 0 or Exception happen when Socket connection is broken
    int ret = s.Receive(receive, receive.Length, 0);
    while (ret > 0)
    {
         OnMessageRecieved(new RecievedMessage(receive));
         for (int i = 0; i < MESSAGE_LENGTH; i++)
         {
             receive[i] = 00;
         }
         ret = s.Receive(receive, receive.Length, SocketFlags.None);
    }
试试看
{
//接收将被阻止,直到数据到来
//ret为0或套接字连接断开时发生异常
int-ret=s.Receive(Receive,Receive.Length,0);
而(ret>0)
{
OnMessageReceived(新收到的消息(接收));
对于(int i=0;i
但随后,发送的部分消息使用空值而不是正确的值(连接在一起的消息)


如何解决它?

OnMessageRecieved做了什么?@JonSkeet非常好的一点,它可以保存新的
ReceivedMessage
以及所有缓冲区(假设类保持接收)。您应该使用“ret”中的值从“receive”提取/复制数据缓冲区,并将其传递给OnMessageReceived()。然后您只需保持“receive”不变,而不是每次都创建一个新的缓冲区。此类用于某些项目,因此我抛出事件并将当前消息发送到主项目。