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

[复制链接]
查看11 | 回复3 | 2021-1-27 06:31:08 | 显示全部楼层 |阅读模式
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里面停止异步监听和接收?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:31:08 | 显示全部楼层
谁知道你的NewConnection是什么东东?往往一大堆代码的问题,就是根本没有贴出该贴的代码。这种问题根本无法回答。
代码SocketListener.EndAccept(asyn)所返回的对象,就是客户端连接。要告诉.net系统去终止监听其消息,那么执行此对象的Close方法就行了。

回复

使用道具 举报

千问 | 2021-1-27 06:31:08 | 显示全部楼层
要是你执行SocketListener.Close();只能让我感觉“昏倒”。你这就好像是要打死一只蟑螂,结果先把房子给铲平了。唉!
回复

使用道具 举报

千问 | 2021-1-27 06:31:08 | 显示全部楼层
关注这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行