当前位置:编程学习 > C#/ASP.NET >>

VB.NET socket类实现结束异步监听、停止异步接收的方法


vb.net里面socket类没有stop方法,所以如果要结束正在进行的监听或者接受,只能直接终止该监听或接受所在的线程啦。
举例如下(2005年的一个帖子)
private   void   Form1_Load(object   sender,   EventArgs   e) 

        SocketListener   =   new   Socket(AddressFamily.InterNetwork,   SocketType.Stream,   ProtocolType.Tcp); 
        IPEndPoint   ipLocal   =   new   IPEndPoint(IPAddress.Any,   8080); 
        SocketListener.Bind(ipLocal); 
        SocketListener.Listen(100); 
        SocketListener.BeginAccept(new   AsyncCallback(OnClientConnect),   SocketListener); 


private   void   OnClientConnect(IAsyncResult   asyn) 

        Socket   SocketListener   =   (Socket)asyn.AsyncState; 
        NewConnection(SocketListener.EndAccept(asyn)); 
        SocketListener.BeginAccept(new   AsyncCallback(OnClientConnect),   SocketListener); 


private   void   button1_Click(object   sender,   EventArgs   e) 

        if   (SocketListener   !=   null) 
        { 
                SocketListener.Close(); 
        } 
}

当时该程序的作者给出了上面的代码,求终止socket监听的方法,这两天用了下vb,也需要解决这个问题,找了半天也没有找到更好的解决方法,所以就只能采用笨一点的法子:每次调用自定义回调函数的时候记录一下线程变量,在需要终止监听的时候用abort方法结束该线程。

Dim m_CurrThread as System.Threading.Thread = Nothing

private   void   Form1_Load(object   sender,   EventArgs   e) 

        SocketListener   =   new   Socket(AddressFamily.InterNetwork,   SocketType.Stream,   ProtocolType.Tcp); 
        IPEndPoint   ipLocal   =   new   IPEndPoint(IPAddress.Any,   8080); 
        SocketListener.Bind(ipLocal); 
        SocketListener.Listen(100); 
        SocketListener.BeginAccept(new   AsyncCallback(OnClientConnect),   SocketListener); 


private   void   OnClientConnect(IAsyncResult   asyn) 

        m_CurrentThread = System.Threading.Thread.CurrentThread
        Socket   SocketListener   =   (Socket)asyn.AsyncState; 
        NewConnection(SocketListener.EndAccept(asyn)); 
        SocketListener.BeginAccept(new   AsyncCallback(OnClientConnect),   SocketListener); 


private   void   button1_Click(object   sender,   EventArgs   e) 

        if   (SocketListener   !=   null) 
        { 
                SocketListener.Close(); 
        } 
}


在需要停止监听的时候除了用close关闭套接字外,加上一句m_CurrentThread.Abort()

我在我自己的程序里试验过了,只要创建监听和结束监听不太频繁,这种方法可行。但是如果创建监听和结束监听的切换很快的话,由于是异步方式,程序会有一定概率出错。不知道大家有什么好的解决办法,实现vb里面停止异步监听和接收? --------------------编程问答-------------------- 谁知道你的 NewConnection 是什么东东?往往一大堆代码的问题,就是根本没有贴出该贴的代码。这种问题根本无法回答。

代码
SocketListener.EndAccept(asyn)
所返回的对象,就是客户端连接。要告诉.net系统去终止监听其消息,那么执行此对象的Close方法就行了。
--------------------编程问答-------------------- 要是你执行
SocketListener.Close();  
只能让我感觉“昏倒”。你这就好像是要打死一只蟑螂,结果先把房子给铲平了。唉! --------------------编程问答-------------------- --------------------编程问答-------------------- 关注这个问题
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,