server.BeginAccept(new AsyncCallback(AcceptConn), server); 
                private void AcceptConn(IAsyncResult iar) 
        { 
            Socket sock = (Socket)iar.AsyncState;//委托对象转换??
            client = sock.EndAccept(iar); //?
 对于iasyncresult接口的理解比较糊涂?
希望高手点拨下!
分比较少,请勿见怪啊!

解决方案 »

  1.   

    大概就是一个SOCKET连接信息...
      

  2.   

    其实很简单,
    server.BeginAccept(new AsyncCallback(AcceptConn), server); 
    这里,首先第一个参数是要你给出一个委托,当一个连接被接受之后调用这个委托。而第二个参数则是状态对象。你可以理解为调用这个委托所使用的参数。
    从上面的代码中可以看出,你的委托是AcceptConn,而实际参数是server,很明显这个server就是你的socket。
    这个iar对象是一个接口,通过这个接口可以取得你在BeginAccept时所传递的那个状态对象,只是它是object类型的,所以需要强制转换一次:
    Socket sock = (Socket)iar.AsyncState;
      

  3.   

    谢谢您。
    您的意思是我通过AsyncCallback()方法异步调用委托AcceptConn,而传递过去的对象是server(其实它是主程序线程里面的一个 socket对象)而经过AsyncCallback()方法异步调用后,返回一个接口参数IAsyncResult iar,此刻其实iar就是原来的server对象,但已经被转换成了一个object类型。所以一上来把它转换过来?
    不知道我的理解对不对,再求教。
    (比较贪婪我,真是麻烦您了)
      

  4.   

    phy您认为对吗?谢谢eglic!
     还有想问下,这样是不是如果很多client端 scoket连接上服务器来都能生成一个这样的子线程并继续和client 通讯直到结束。跟主监听的线程完全没有关系了,但这样子我疑问的是通讯端口是什么?因为主线程的侦听端口不可能被占用的啊,难到这个异步方法自己已经将和client 通讯端口从侦听端口改换到其他端口了??
    谢谢指教! 
      

  5.   

     似乎自己理解错了,AsyncCallback()就是一个委托而Acceptconn是一个函数,而AsyncCallback(Acceptconn) 则是委托调用。可别误导了看帖的其他人啊:)
      

  6.   

    您的意思是我通过AsyncCallback()方法异步调用委托AcceptConn,而传递过去的对象是server(其实它是主程序线程里面的一个 socket对象)而经过AsyncCallback()方法异步调用后,返回一个接口参数IAsyncResult iar,此刻其实iar就是原来的server对象,但已经被转换成了一个object类型。所以一上来把它转换过来?
    不知道我的理解对不对,再求教。
    (比较贪婪我,真是麻烦您了)对于你的理解,大体的流程是正确的。有几点仍需要说明:
    1、AsyncCallback是委托类型,而不是方法。
    你通过 new AsyncCallback(AcceptConn);实际上调用了AsyncCallback这种委托类型的构造函数(new 后面的都是构造函数)。这个构造函数的参数是一个方法名,也就是AcceptConn。
    调用构造函数的结果,使你得到了一个AsyncCallback类型的委托。
    2、iar就是IAsyncResult接口,而不是object类型对象。但是IAsyncResult它有一个属性:AsyncState,这才是你传递的server对象。后面关于object类型的理解是正确的。