Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Утечка памяти Добавлено: 13.01.09 07:37  

Автор вопроса:  admsasha | Web-сайт: dansoft.krasnokamensk.ru | ICQ: 234002454 
Есть вот такой код
Imports System.Net
Imports System.Net.Sockets
Imports System.IO
Imports System.Threading

Module Module1
    Private Structure arrstream
        Dim St1 As System.Net.Sockets.NetworkStream
        Dim St2 As System.Net.Sockets.NetworkStream
    End Structure

    Sub Main()

        Console.Write("Server starting... " & vbCrLf)

        Dim Thread = New System.Threading.Thread(AddressOf tListener)
        Thread.Start()

    End Sub

    Private Sub tListener()
        Dim Client As Net.Sockets.TcpClient
        Dim Stream As System.Net.Sockets.NetworkStream
        Dim Stream2 As System.Net.Sockets.NetworkStream
        Dim st As arrstream
        'Dim Server = New TcpClient

        Dim Listener = New TcpListener(Net.IPAddress.Any, 1234)
        Listener.Start()

        While True
            Client = Listener.AcceptTcpClient() 'вот здесь обычно ждет клиента

            Try

                Console.Write("new client: " & Client.Client.RemoteEndPoint.ToString & vbCrLf)

                Dim Server = New TcpClient("10.10.1.1", "8888")

                Stream = Client.GetStream()
                Stream2 = Server.GetStream()

                st.St1 = Stream
                st.St2 = Stream2

                Dim Thread = New System.Threading.Thread(AddressOf srv1)
                Thread.Start(st)
                Thread.Join()

                Dim Thread2 = New System.Threading.Thread(AddressOf srv2)
                Thread2.Start(st)
                Thread2.Join()


            Catch ex As Exception
                Console.Write(ex.Message & vbCrLf)
            End Try

        End While
    End Sub

    Private Sub srv1(ByVal st As arrstream)
        Dim byte1(1024) As [Byte] 'Buffer
        Dim message As String
        'Dim st As arrstream
        Dim Stream As System.Net.Sockets.NetworkStream
        Dim Stream2 As System.Net.Sockets.NetworkStream


        Stream = st.St1
        Stream2 = st.St2

        Try
            While True
                message = Stream.Read(byte1, 0, byte1.Length)
                If Not message > 0 Then
                    Stream.Close()
                    Stream2.Close()
                    Exit Sub
                End If
                message = System.Text.Encoding.GetEncoding("windows-1251").GetString(byte1, 0, message)
                Stream2.Write(byte1, 0, message.Length)
            End While
        Catch ex As Exception
            Console.Write(ex.Message & vbCrLf)
        End Try

    End Sub

    Private Sub srv2(ByVal st As arrstream)
        Dim byte1(1024) As [Byte] 'Buffer
        Dim message As String
        Dim Stream As System.Net.Sockets.NetworkStream
        Dim Stream2 As System.Net.Sockets.NetworkStream

        Stream = st.St1
        Stream2 = st.St2

        Try
            While True
                message = Stream2.Read(byte1, 0, byte1.Length)
                If Not message > 0 Then
                    Stream.Close()
                    Stream2.Close()
                    Exit Sub
                End If

                message = System.Text.Encoding.GetEncoding("windows-1251").GetString(byte1, 0, message)
                Stream.Write(byte1, 0, message.Length)

            End While
        Catch ex As Exception
            Console.Write(ex.Message & vbCrLf)
        End Try

    End Sub

End Module




Если коротко, то сервер сервер должен подключать сколько угодно клиентов и всё что идет на порт 1234, пересылать на 10.10.1.1:8888.

Проблемы. При подключении постоянно выделяется дополнительные 24-44 Кб.

И просьба спецам, оптимизировать и указать какие улучшения можно сделать

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 FIX



ICQ: 348680795 

Вопросов: 39
Ответов: 62
 Профиль | | #1 Добавлено: 13.01.09 14:52
  1. GC.Collect
пробовал?

Ответить

Номер ответа: 2
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #2 Добавлено: 15.01.09 13:28
Где ты видишь что выделяется память? С чего взял что здесь утечка? По-твоему потоки и объекты - бесплатные ресурсы?

Ответить

Номер ответа: 3
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #3 Добавлено: 17.01.09 15:23
Это ли утечка?
Вот у меня, помню, прога по ходу загрузки съедала 150мб ОЗУ, по крайней мере диспетчер задач так говорил.
При минимизации память освобождалась.
Я так и сделал, вписал в прогу сворачивание - разворачивание.

Ответить

Номер ответа: 4
Автор ответа:
 admsasha



ICQ: 234002454 

Вопросов: 56
Ответов: 69
 Web-сайт: dansoft.krasnokamensk.ru
 Профиль | | #4
Добавлено: 17.01.09 17:02
Если подключаться и отключаться 10 раз, то память выделится на каждый раз +44Kb, БЕЗ её освобождения. GC.Collect пробывал, эффэкта не дало.

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 23.01.09 00:25
А GC.Collect и не обязательно будет освобождать память. Посмотри как работает модель памяти в .NET, возможно будет понятнее.

Ответить

Номер ответа: 6
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #6 Добавлено: 23.01.09 03:40
Абсолютно не понятно, зачем в коде присутствует данная процедура
  1.     Private Sub srv2(ByVal st As arrstream)
а так же не ясно, к чему
  1. Thread.Join()

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам