Jump to content

    

Visual Studio 2010, tcpclient

В приведенной функции есть буфер byte[] buffer = new byte[_tcpСlient.Available]; Он "местного значения". Мне нужно либо скопировать его в глобальный массив либо как-то сделать чтобы прием велся сразу в глобальный массив. Пробовал копировать в цикле - не получается. Максимум что удалось - это скопировать первый элемен массива, а нужно 256 (1460 максимум). Может есть что-то типа memcpy? Прошу помочь. Спасибо.

 

 

       // Цикл извлечения сообщений,
        // запускается в отдельном потоке.
        void ReceiveRun()
        {
            while (true)
            {
                try
                {
                    string s = null;
                    //int i=0;
                    while (ns.DataAvailable == true)
                    {
                        // Определение необходимого размера буфера приема.
                        byte[] buffer = new byte[_tcpСlient.Available];

                        ns.Read(buffer, 0, buffer.Length);
                        s += Encoding.Default.GetString(buffer);
                    }

                    if (s != null)
                    {
                        ShowReceiveMessage(s);
                        s = String.Empty;
                    }


                    // Вынужденная строчка для экономия ресурсов процессора.
                    // Неизящный способ.
                    Thread.Sleep(100);
                }
                catch
                {
                    ErrorSound();
                }

                if (_stopNetwork == true) break;

            }
        }
        #endregion

Share this post


Link to post
Share on other sites
есть буфер byte[] buffer = new... Он "местного значения"

Выделяется память, и не освобождается. Уже проблема.

 

Почему-то выделяется _tcpСlient.Available байт памяти, а читать пытается buffer.Length (кстати, откуда у buffer, который простой массив, берётся Length? как это вообще компилируется?).

 

Ну и в конце концов, отчего не передать в ns.Read указатель на глобальный массив, и его размер? Не надо будет каждый раз выделять память в потоке.

Share this post


Link to post
Share on other sites
Выделяется память, и не освобождается. Уже проблема.
Это не проблема, это C# - у него есть сборщик мусора. Он сам удалит память.

 

В приведенной функции есть буфер byte[] buffer = new byte[_tcpСlient.Available]; Он "местного значения". Мне нужно либо скопировать его в глобальный массив либо как-то сделать чтобы прием велся сразу в глобальный массив.
Просто верни из функции этот самый buffer. Сборщик мусора позаботится об остальном.

 

Share this post


Link to post
Share on other sites

Спасибо за помощь, попробую. Только оно еще и виснет периодически, не понятно от чего. Ошибок не пишет. Просто клякнет. Закроешь - закроется, только сокет не закроестся, а это проблема.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this