程序代码如下:
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?
C#异步Socket关闭问题
答案:2 悬赏:70 手机版
解决时间 2021-04-22 17:17
- 提问者网友:書生途
- 2021-04-22 11:59
最佳答案
- 五星知识达人网友:逃夭
- 2021-04-22 13:36
下面网址。我写的类似的情况,看看对你有没有帮助
全部回答
- 1楼网友:夜余生
- 2021-04-22 15:16
异步的意思就是当服务端发送给客户端多少数据,客户端就接收多少数据,而不是客户端请求接收多少数据,然后等待服务端发送数据。
mysocket.beginreceivefrom(rdata, 0, _dlen, socketflags.none, ref _recvep, new asynccallback(callreceive), null);
重要的就是asynccallback这个参数了,这个是一个委托,就是函数的指针,将你需要接收数据的函数声明为委托,作为这个参数,在接收到数据的时候,这个函数就会被调用。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯