首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

关于非托管代码开释的疑问

2014-01-17 
关于非托管代码释放的疑问小弟做了个TCPIP服务器程序,由于对于.net的一些基本概念不是很了解,所以想问问关

关于非托管代码释放的疑问
小弟做了个TCPIP服务器程序,由于对于.net的一些基本概念不是很了解,所以想问问关于非托管代码释放的问题

我个人觉得有close方法的是基本都是非托管对象,必须先close再nothing才能真正的释放

clientSocket = serverSocket.AcceptTcpClient()这句话应该是相当于New了一个对象实例,那么如果循环等待连接的话,就是循环New,这么下去是要内存出错的吧,所以我想应该释放
如果在等待连接线程里clientsocket.close,那么等待数据线程里Dim networkStream As NetworkStream = clientSocket1.GetStream()就会报错

那要怎么释放第一个线程里的对象呢??

下面是服务器代码:
我用一个线程等待客户端连接进来

 Private Sub WaitLink()

        Dim clientSocket As TcpClient
        Try
            Do While True
                clientSocket = serverSocket.AcceptTcpClient()
                '打开等待数据线程
                myWaitData = New Thread(AddressOf WaitData)
                myWaitData.IsBackground = True
                myWaitData.Start(clientSocket)
                '使用下面close会造成等待数据线程错误
                'clientsocket.close
                clientsocket=nothing
            Loop
        End Try

    End Sub


下面是等待数据子线程代码


    Private Sub WaitData(ByVal inClientSocket As TcpClient)
        dim clientSocket1 as TcpClient
        clientSocket1 = inClientSocket
        '循环标志位
        Dim infiniteCounter As Integer
        Dim requestCount As Integer
        Dim bytesFrom(10024) As Byte

        For infiniteCounter = 1 To 2
            infiniteCounter = 1
            Try
                requestCount = requestCount + 1
                Dim networkStream As NetworkStream = clientSocket1.GetStream()
                networkStream.Read(bytesFrom,0,CInt(clientSocket1.ReceiveBufferSize))

            End Try
        Next

    End Sub


.net 非托管代码 内存释放 TCPIP
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗

按你说的情况是会出错的,你应该做成1对1的
然后用一个全局list保存所有的clientsocket,然后在每一个clientsocket用完后关闭


嗯,小弟笨了,要是做成一对一的,那么我也不知道需要多少个全局的clientsocket,这怎么声明这些clientsocket

我看了下你的代码,你的思路是:先创建一个clientsocket,然后等待用户连接
其实你可以倒过来想:有客户连接时再创建clientsocket,这样就行了 之前做socket通信是这么做的
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗

按你说的情况是会出错的,你应该做成1对1的
然后用一个全局list保存所有的clientsocket,然后在每一个clientsocket用完后关闭



嗯,小弟笨了,要是做成一对一的,那么我也不知道需要多少个全局的clientsocket,这怎么声明这些clientsocket

我看了下你的代码,你的思路是:先创建一个clientsocket,然后等待用户连接
其实你可以倒过来想:有客户连接时再创建clientsocket,这样就行了 之前做socket通信是这么做的


没有clientSocket = serverSocket.AcceptTcpClient()我怎么知道有客户连接呢??这句话才是等待客户连接的阻塞语句啊,有客户连接,这句话才往下走啊~~~~求解~~~

我看错了,这样做就可以了

Private Sub WaitLink()       
        Try
            Do While True
                Dim clientSocket As TcpClient
                clientSocket = serverSocket.AcceptTcpClient()
                '打开等待数据线程
                myWaitData = New Thread(AddressOf WaitData)
                myWaitData.IsBackground = True
                myWaitData.Start(clientSocket)
                '使用下面close会造成等待数据线程错误
                'clientsocket.close
                clientsocket=nothing
            Loop
        End Try
 
    End Sub

[解决办法]
这么写不对呀,你看呀,i=0的时候,ss已经new了一个对象,他指向一个对象,可是i=1的时候,又new了一个,应该指向另外一个变量,如果指向同一个变量,实际传递给这个变量新的地址,旧的对象的地址被丢弃,导致旧的没办法delete,造成内存泄露

热点排行