请问有关vb.net中TCP编程的有关问题
请教有关vb.net中TCP编程的问题
最近写一个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
最近写一个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))