vb.net里面socket类没有stop方法,所以如果要结束正在进行的监听或者接受,只能直接终止该监听或接受所在的线程啦。
举例如下(2005年的一个帖子)
privatevoidForm1_Load(objectsender,EventArgse)
{
SocketListener=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPointipLocal=newIPEndPoint(IPAddress.Any,8080);
SocketListener.Bind(ipLocal);
SocketListener.Listen(100);
SocketListener.BeginAccept(newAsyncCallback(OnClientConnect),SocketListener);
}
privatevoidOnClientConnect(IAsyncResultasyn)
{
SocketSocketListener=(Socket)asyn.AsyncState;
NewConnection(SocketListener.EndAccept(asyn));
SocketListener.BeginAccept(newAsyncCallback(OnClientConnect),SocketListener);
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(SocketListener!=null)
{
SocketListener.Close();
}
}
当时该程序的作者给出了上面的代码,求终止socket监听的方法,这两天用了下vb,也需要解决这个问题,找了半天也没有找到更好的解决方法,所以就只能采用笨一点的法子:每次调用自定义回调函数的时候记录一下线程变量,在需要终止监听的时候用abort方法结束该线程。
Dimm_CurrThreadasSystem.Threading.Thread=Nothing
privatevoidForm1_Load(objectsender,EventArgse)
{
SocketListener=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPointipLocal=newIPEndPoint(IPAddress.Any,8080);
SocketListener.Bind(ipLocal);
SocketListener.Listen(100);
SocketListener.BeginAccept(newAsyncCallback(OnClientConnect),SocketListener);
}
privatevoidOnClientConnect(IAsyncResultasyn)
{
m_CurrentThread=System.Threading.Thread.CurrentThread
SocketSocketListener=(Socket)asyn.AsyncState;
NewConnection(SocketListener.EndAccept(asyn));
SocketListener.BeginAccept(newAsyncCallback(OnClientConnect),SocketListener);
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(SocketListener!=null)
{
SocketListener.Close();
}
}
在需要停止监听的时候除了用close关闭套接字外,加上一句m_CurrentThread.Abort()
我在我自己的程序里试验过了,只要创建监听和结束监听不太频繁,这种方法可行。但是如果创建监听和结束监听的切换很快的话,由于是异步方式,程序会有一定概率出错。不知道大家有什么好的解决办法,实现vb里面停止异步监听和接收?
分 -->
|