异步客户端句柄接收

本文关键字:句柄 客户端 异步 | 更新日期: 2023-09-27 18:12:42

我被告知几次异步更好,或者我应该使用异步而不是同步套接字,因此开始学习它,但我已经有困难了。

我已经对回调如何工作以及如何建立连接有了基本的感觉。

我使用这个msdn代码作为参考!

几个问题,我有与代码:

  • 当前该代码将连接到服务器,发送文本,读取响应并退出。我怎么做,这样我就可以继续接收数据,直到服务器断开连接和/或我自己结束它?我不太确定我应该如何做到这一点,如果我需要在一个线程上包装它,而一旦ReceiveCallback完成,它就会再次调用Receive。

  • 我注意到的另一件事是,当它连接时,套接字被分配给客户端但代码本身总是重新分配客户端套接字与同步套接字相比,我不太理解我们有一个主套接字,我们总是咨询等

我不确定我使用的参考文献有多老,但如果你能帮助我举出我所指出的例子,我将不胜感激,因为这对我来说更容易理解。

更新:

    private void SetupRecieveCallback(Socket sock)
    {
        new Thread(
            delegate()
            {
                while (isReceiving)
                {
                    _receiveQueue.Reset();
                    try
                    {
                        AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
                        sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock);
                    }
                    catch (Exception ex)
                    {
                        _logger.Error("Setup Recieve Callback failed! " + ex.Message);
                    }
                    _receiveQueue.WaitOne();
                }
            }
        ).Start();
        /*
                    // The original code
        try
        {
            AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
            sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock);
        }
        catch (Exception ex)
        {
            _logger.Error("Setup Recieve Callback failed! " + ex.Message);
        }
        */
    }

异步客户端句柄接收

只需在回调中再次调用BeginReceive()以保持接收。当服务器中断连接时,你的回调将被调用,EndReceive()抛出ObjectDisposedException。这就是停止调用BeginReceive()的方法。

第二个问题更难解码(只问一个)。我猜你对这句话感到困惑:

private static void ConnectCallback(IAsyncResult ar) {
    try {
        // Retrieve the socket from the state object.
        Socket client = (Socket) ar.AsyncState;
        // etc..

此处没有重新分配套接字。代码只是获取对原始套接字的引用。这是一个有用的技术,它允许多个连接使用这个回调。通过下面的语句,ar.AsyncState的值必须是套接字:

        client.BeginConnect( remoteEP, 
            new AsyncCallback(ConnectCallback), client);

注意客户端是如何传递给AsyncCallback构造函数的。在回调中检索的完全相同的客户端