永发信息网

C#异步Socket关闭问题

答案:2  悬赏:70  手机版
解决时间 2021-04-22 17:17
程序代码如下:
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Parse(MyIP), port));
listener.Listen(5);
listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);

AsyncCallback回调函数:
private void OnConnectRequest(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
SocketChatClient client = new SocketChatClient(listener.EndAccept(ar));
string tips = "Client " + client.Sock.RemoteEndPoint.ToString() + " join";
Invoke(m_AddToList, new string[] { tips });
client.SetupRecieveCallback(this);
listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
}
}

关闭listener
if (this.listener != null)
{
//listener.Shutdown(SocketShutdown.Both);

listener.Close();
}

问题:
在以上的代码是在一个子窗口里的,当关闭子窗口的时候,调用listener.Close()以后,程序会进入到OnConnectRequest,这时在SocketChatClient client = new SocketChatClient(listener.EndAccept(ar));这里会出现无法访问已释放的资源的异常,因为listener被Close掉了,所以出现这个异常。
问题是为什么调用Close以后会激发了这个OnConnectRequest回调函数呢?这个不是有客户端接入的时候才会调用吗?
如何手动正确的关闭一个正在BeginAccept的Socket?
最佳答案
下面网址。我写的类似的情况,看看对你有没有帮助
全部回答
异步的意思就是当服务端发送给客户端多少数据,客户端就接收多少数据,而不是客户端请求接收多少数据,然后等待服务端发送数据。 mysocket.beginreceivefrom(rdata, 0, _dlen, socketflags.none, ref _recvep, new asynccallback(callreceive), null); 重要的就是asynccallback这个参数了,这个是一个委托,就是函数的指针,将你需要接收数据的函数声明为委托,作为这个参数,在接收到数据的时候,这个函数就会被调用。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
“爱”不需要理由吗?
有一首网络歌曲,第一句是这么唱的
农安县绅士房地产开发有限公司地址有知道的么
我的电脑开机显示reboot and select porper b
今年广西理科450分是不是能上桂林医学院啊?
别人拿辣椒泼我,还手打他,这是不是防卫?
明天是本人的生日,真不知怎样渡过??
如何有效的自我管理,大学四年应该做什么有意
跪求单机版的QQ音速?
18岁应用哪些护肤品?
惠崇春江晚景千古名句,描写秋天夜晚景色的句
天龙八部新莽2级能卖多少钱啊!
女人为什么越来越注意保养???
白血病儿童应该受到关爱吗?
谁说喝酒不好
推荐资讯
qq2009 sp1 繁体正式版
生何求,淡薄名利,人所求,过眼烟云
仁华医药连锁太康店在哪里啊,我有事要去这个
喜雀入屋的意思是什么?
兴化市旭日电热绝缘材料厂销售部在什么地方啊
在网吧能不能进行淘宝交易?安全不?
人一生最不可缺少的是金钱吗?
表达工作心态好的句子,描写通过努力工作,好事
爱情是美好的吗?
用牛奶和西红柿汁敷脸行吗
怎样开通万花筒业务
哪里可以直接翻译一整篇文字(汉语-英语)
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?