Баг утечка памяти tcp соединения.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Баг утечка памяти tcp соединения.

Сообщение Res5 » 07.08.2014 (Чт) 8:19

Мое приложение имитирует клиент tcp. Данные я принимаю асинхронно по 1ному байту спомощью BeginReceive(client.BeginReceive(state.buffer, 0, 1, 0, AddressOf ReceiveCallback, state)) . К сожалению каждую минуту в памяти приложение увеличивается всреднем на 1н мегабайт. Пробовал делать так client.BeginReceive(state.buffer, 0, 1, 0, new AsyncCallback(AddressOf ReceiveCallback), state) все также увеличивается. Пробовал крутить пустой ReceiveCallback, всеравно. Существует ли способ асинхронного приема без багов в памяти?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.08.2014 (Чт) 12:28

А кто будет EndReceive и Dispose вызывать?

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Баг утечка памяти tcp соединения.

Сообщение Res5 » 07.08.2014 (Чт) 14:15

Сервер шлет данные постоянно.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Баг утечка памяти tcp соединения.

Сообщение Res5 » 07.08.2014 (Чт) 14:48

Добавил:
Код: Выделить всё
Dim Length as Integer = client.EndReceive(ar)

Память всеравно растет, но уже немного медленней. Тестил на пустом Callback.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.08.2014 (Чт) 22:43

Подробнее.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Баг утечка памяти tcp соединения.

Сообщение Res5 » 07.08.2014 (Чт) 23:23

Код: Выделить всё
Public test As Boolean
   
Public Sub ReceiveCallback(ByVal ar As IAsyncResult)

        Dim state As StateWSocket = CType(ar.AsyncState, StateWSocket)
        Dim client As Socket = state.workSocket

        bRecive += 1

        Dim Size As Integer = client.EndReceive(ar)

        If test = False Then

            If BeginShifle = True Then

                crypt.Decrypt(state.buffer) 'класс для расшифровки
                Dim bMPPC() As Byte

                bMPPC = MPPCunpacker.Unpack(state.buffer(0)) 'класс для распаковки

                If IsNothing(bMPPC) = False Then

                    For i = 0 To (bMPPC.Length - 1)

                        GoPacket(bMPPC(i)) 'расшифрованный пакет

                    Next

                End If


            Else

                GoPacket(state.buffer(0)) 'cборка пакета без шифрации по 1ному байту

            End If

        End If

        client.BeginReceive(state.buffer, 0, 1, 0, AddressOf ReceiveCallback, state)

    End Sub


Под "пустым Callback" я имел ввиду присвоение test = True. Данные после авторизации не обрабатываю, а просто пропускаю, чтобы была конкретизация проблемы.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.08.2014 (Пт) 0:57

Можно целую программу, которую можно запустить без спецоборудования?

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Баг утечка памяти tcp соединения.

Сообщение Res5 » 08.08.2014 (Пт) 9:29

Программа слишком большая. Вродебы нашел причину: If skt.Poll(-1, SelectMode.SelectError) Then . Убрал и память перестала расти.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList