繁体   English   中英

异步客户端句柄接收?

[英]Async client handle receive?

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

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

我正在使用此msdn代码作为参考!

我的代码有一些问题:

  • 当前,该代码将连接到服务器,发送文本,读取响应并退出。 我该如何做才能继续接收数据,直到服务器断开我的连接和/或我自己结束该数据为止? 如果我需要使用while或简单的调用将其包装在线程上,一旦ReceiveCallback完成,则再次接收,我不太确定该怎么做。

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

我不确定我使用的参考文献的年龄,但是如果您能通过我所指出的示例帮助我,将不胜感激,因为它使我更容易理解。

更新:

    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构造函数。 在回调中检索到的客户端完全相同。 可以传递任何对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM