当前位置:编程学习 > C#/ASP.NET >>

关于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)
}


另外,即使你修改此处,你的服务器也只会接受第一次,因你的代码不对,异步每接受完一次连接需要放入再次接受。网上代码很多的。 --------------------编程问答--------------------
引用 1 楼 ycg_893 的回复:
 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#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,