Socket sock=myTcpListener.AcceptSocket();
User user=(User)sock;这样是肯定不可以的,父类不能转换为子类,只有子类可以转换为父类!象你这种情况,你只能从一个 sock想办法去生成USER(根据sock的数据来生成一个新的USER,我估计很难)建议你这样
public class User
{
    public Socket sock;
    然后扩展你自己的方法
}
这样你就比较好转换了

解决方案 »

  1.   

    接上位兄弟然后
    user.sock =sock;
      

  2.   

    “异步调用可以使用User。”
    这和异步调用有什么关系?写出来看看好么?
      

  3.   

    因为我想使用Socket.Select(),方法监控多个socket的状态,
    如果能够继承Socket,那么每次取某个socket的消息的时候,
    便很容易通过它的属性(如连接者的id等)知道它的身份,而且
    可以直接调用它的方法。
    cxx1997(小网虫_L) 你提到的方法是可以,但是不是最方便,
    public class User
    {
        public Socket sock;
        然后扩展你自己的方法
    }
    如果用这样的方式,当Socket.Select(),调用后得到一个socket的
    数组,通过socket并不能知道每个连接的身份;而如果可以设法将
    TcpListener得到的socket传给User,就可以通过Socket.Select()得
    到一个User的数组,这样就简单多了。现在的问题是,继承socket虽然可以,但不知如何TcpListener得到
    的socket传给User
      

  4.   

    cxx1997(小网虫_L) 说的不错,不应该继承 socket 类,而应该把你的 socket 作为你的类的一个属性。
    User user = new User(socket)
      

  5.   

    nn2003(csharp 2003)所说异步调用是对的;但不是用于TcpListener;而只能用于Socket。我有例子,不过不在手头;大概写一下吧:socket.BeginAccept(new AsyncCallback(asc),user);
    private void asc(IAsyncResult  ar)
    {
    User user=(User)ar.AsyncState;
    //...


    }
      

  6.   

    //便很容易通过它的属性(如连接者的id等)知道它的身份,而且
    可以直接调用它的方法。
    public class User
    {
        public Socket sock;
        然后扩展你自己的方法
    }
    这样做,你要用原来sock的方法,只需要user.sock.select(),也是一样的
      

  7.   

    cxx1997(小网虫_L) 你没有理解我的意图,我是想通过Socket.Select()得
    到一个User的数组,而不是Socket数组。还有Socket.Select(socketlist,null,null,1000)
    是一个静态方法。如果按照你的方式,虽然也可以用Socket.Select,但得到的只能是一组
    socket,不能通过这些socket知道每个连接的身份。
      

  8.   

    poetc(伊公子)你说的如下的这个方法,
    socket.BeginAccept(new AsyncCallback(asc),user);
    //这里用socket对象的BeginAccept方法,传递的却是user,是不行的。
    private void asc(IAsyncResult  ar)
    {
    User user=(User)ar.AsyncState;
    //这得到的只是用于异步操作的一个对象,并非通过响应用户连接请求得到的,
    已经建立了Socket连接的User对象。只有调用了EndAccept才能活动这个连接,
    如下所示,但EndAccept方法返回的也是Socket对象,仍没得到User对象。
    Socket sock=user.EndAccept(ar);
    //...
    }
    你可以找一下你说的例子
      

  9.   

    public class User
    {
        public Socket sock;
        public User[] Select()
       {
           先调用sock.select得到Socket数组,然后,再将这个数组转换为USER数组
        }
    }
      

  10.   

    /////////////////////////////////////////////////////
    还有Socket.Select(socketlist,null,null,1000)
    是一个静态方法。如果按照你的方式,虽然也可以用Socket.Select,但得到的只能是一组
    socket,不能通过这些socket知道每个连接的身份。
    //////////////////////////////////////////////////////
    这段话,我不是太理解,为什么通过USER。Socket.Select就不能得到这些连接的身份???
      

  11.   

    public class User:Socket{
        public string userid;
    }
    这样我在从一个user对象读内容的时候,就能通过它的user.userid知道它的属性了。
    ////////////////////////////////////////////////////////////////////////// 
    public User[] Select()
      {
           先调用sock.select得到Socket数组,然后,再将这个数组转换为USER数组
           //sock对象是没有select方法的
      }
    //////////////////////////////////////////////////////////////////////////
    这里是什么意思,不太明白?
      

  12.   

    我之所以想继承Socket,是因为程序中打算通过Socket.Select()方法,管理多个连接。
    而Socket.Select()方法,支持的是对socket数组或者继承自socket的对象的数组的操作。