【问题标题】:BeginAcceptSocket with null as a state object - issue?BeginAcceptSocket 与 null 作为状态对象 - 问题?
【发布时间】:2012-09-19 17:55:08
【问题描述】:

我得到了一个代码,其中也涉及到一个异步套接字,这是我的初学者。我不知道为什么作为 BeginAccept 套接字的第二个参数的对象状态为空,老实说,我没有从 MSDN 中得到这个参数的使用。还有,为什么要从回调方法再次调用 BeginAccept?

public void Start()
        {

                this.mTcpListener.Start();
                this.mTcpListener.BeginAcceptSocket(this.AcceptClient, null);
        }

 protected void AcceptClient(IAsyncResult ar)
        {
            if (this.mTcpListener != null)
            {
                System.Net.Sockets.Socket s = this.mTcpListener.EndAcceptSocket(ar);
                Client c = new Client(this, s, this.GetFreePlayerID());

                ..some code for adding the client instance to collection....                  
                this.mTcpListener.BeginAcceptSocket(this.AcceptClient, null);
            }
        }

【问题讨论】:

    标签: c# networking asynchronous


    【解决方案1】:

    从 fsimonazzi 开始,我假设这段代码是服务器的一部分,用于保存许多传入连接。

    BeginAccept 用于在套接字上启动接受过程。

    在 AcceptClient 中,它使用 EndAcceptSocket 完成 AcceptConnection 异步过程。

    此时程序不再监听新的连接/套接字。为此,它再次启动异步 BeginAcceptSocket 进程。

    【讨论】:

      【解决方案2】:

      该参数纯粹由调用代码使用。它会回到您的回调,您可以使用它来识别呼叫。使用 null 是完全有效的。

      这里有更多关于异步编程模型http://msdn.microsoft.com/en-us/library/ms228963.aspx的信息。

      第二个附加参数是用户定义的对象。此对象可用于将特定于应用程序的状态信息传递给异步操作完成时调用的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多