请问有关vb.net中TCP编程的有关问题

请教有关vb.net中TCP编程的问题
本帖最后由 mjwang 于 2013-06-03 23:29:08 编辑
最近写一个TCP SERVER的程序,遇到一个问题,使用 BeginAcceptTcpClient 异步接受Client的连接,过程都是正常的,但我是一直允许新的客户端进行连接,所以在使用了EndAcceptTcpClient后,会再次使用BeginAcceptTcpClient进行异步等待新的客户端的接入. 此时,我想手动关闭SERVER, 在关闭过程中使用Listener.Stop()来停止侦听,但由于前面使用了BeginAcceptTcpClient,还没有接受到新的客户端,马上就会跳到EndAcceptTcpClient行提示出错,出错信息为:无法访问已释放的对象。 对象名:“System.Net.Sockets.Socket”。

我把代码做了简化,但同样会有这样的问题,希望大家帮我看看,我应该怎么去把Listener进行STOP操作,(不作STOP操作进行启动SERVER时,又报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。)

下面代码第52行时进行STOP,_Listener.Stop()
错误出在第19行上 tcpClient = tempListener.EndAcceptTcpClient(result)

有什么办法可以把 BeginAcceptTcpClient 状态取消掉, 取消掉后再进行 stop 操作应该就没有问题了.

我使用的VS版本为 VS2008


Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Public Class Form1

    Private _Listener As TcpListener
    Private _Connections As New ArrayList       '记录连接客户端列表
    Private _TcpServerThread As Thread          'TCP服务器进程


    ''' <summary>
    ''' 接受新的客户端事件
    ''' </summary>
    Private Sub DoAcceptClient(ByVal result As IAsyncResult)
        Dim tempListener As TcpListener = CType(result.AsyncState, TcpListener)

        Dim tcpClient As New TcpClient
        tcpClient = tempListener.EndAcceptTcpClient(result)
        _Connections.Add(tcpClient)
        _Listener.BeginAcceptTcpClient(AddressOf DoAcceptClient, _Listener)
    End Sub

    ''' <summary>
    ''' TCP侦听线程主体
    ''' </summary>
    Private Sub TCP_Listen()
        _Listener = New TcpListener(IPAddress.Any, 1314)                        '创建侦听,指定IP和端口
        _Listener.Start()                                                       '侦听开始
        _Listener.BeginAcceptTcpClient(AddressOf DoAcceptClient, _Listener)     '异步等待客户端

        While True
            '暂时先不做任何事情
        End While
    End Sub


    ''' <summary>
    ''' 开始服务器按钮
    ''' </summary>
    Private Sub ButtonStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStart.Click
        _TcpServerThread = New Thread(New ThreadStart(AddressOf TCP_Listen))