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

kekekeyide 2012-09-22 09:11:04

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里面停止异步监听和接收?
...全文
318 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxyzjm62 2012-09-24
  • 打赏
  • 举报
回复
关注这个问题
  • 打赏
  • 举报
回复
要是你执行
SocketListener.Close();  
只能让我感觉“昏倒”。你这就好像是要打死一只蟑螂,结果先把房子给铲平了。唉!
  • 打赏
  • 举报
回复
谁知道你的 NewConnection 是什么东东?往往一大堆代码的问题,就是根本没有贴出该贴的代码。这种问题根本无法回答。

代码
SocketListener.EndAccept(asyn)
所返回的对象,就是客户端连接。要告诉.net系统去终止监听其消息,那么执行此对象的Close方法就行了。

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧