关于Socket的一部接收方法AcceptAsync
自己做了个聊天工具,想在服务端用这种的AcceptAsync异步方法去接收连接对象,发现改成这样后,虽然是异步接收,【SocketAsyncEventArgs】对象触发不了自己的_Completed事件,
如下代码:
private void Listen()
{
//实例化通信对象
ipEndPiont =
new IPEndPoint(IPAddress.Parse(txtIp.Text), int.Parse(txtPort.Text));
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//SocketAysncEventArgs objects to allocate
argsPool = new SocketArgsPool(10);
bufferPool = new BufferPool(1024,1024);
try
{
//设定监听
ServerSocket.Bind(ipEndPiont);
ServerSocket.Listen(10);
//分配【SocketAsyncEventArgs】对象
SocketEventArg = argsPool.CheckOut();
//设定缓冲区大小
bufferPool.CheckOut(SocketEventArg);
SocketEventArg.Completed +=
new EventHandler<SocketAsyncEventArgs>(OnConnectRequest_Completed);
bool IsHadle = ServerSocket.AcceptAsync(SocketEventArg);
}
catch
{
bufferPool.CheckIn(SocketEventArg);
argsPool.CheckIn(SocketEventArg);
throw new SocketException((int)SocketEventArg.SocketError);
}
}
大牛们帮忙,通信这块初学者,在线等待 SocketAsyncEventArgs socket --------------------编程问答-------------------- bool IsHadle = ServerSocket.AcceptAsync(SocketEventArg);
如果 IsHadle == false 时,是不会发生 SocketEventArg.Completed 事件的。
所以需要如下
if(!IsHadle)
{
OnAccept(SocketAsyncEventArgs e); //此函数为接受函数,也是 Completed 事件需要调用的函数(e.LastOperation == SocketAsyncOperation.Accept)
}
另外,即使你修改此处,你的服务器也只会接受第一次,因你的代码不对,异步每接受完一次连接需要放入再次接受。网上代码很多的。 --------------------编程问答--------------------
bool IsHadle = ServerSocket.AcceptAsync(SocketEventArg);
IsHandle值是true,证明它就是异步处理,由于处理在Completed事件里面写着,目前代码里不能触发Completed事件
补充:.NET技术 , C#