我的程序是每侦听到一个连接请求,就为该连接创建一个线程来完成这个连接的收发,如下:
ClientSocket是CSocket的派生类void CClientSocket::OnAccept(int nErrorCode) 
{
   ....
   Accept(m_connection[nSocket]);//m_connection是ClientSocket类型的数组
   ....
   CConnectThread* ConnectThread;
   ConnectThread=new CConnectThread();
   ConnectThread->m_hSocket=(SOCKET)m_connection[nSocket].Detach();
   ConnectThread->CreateThread();
}
在CWinThread的派生类ConnectThread中Attach套接字,
int CConnectThread::ExitInstance()
{
// TODO:  perform any per-thread cleanup here
m_ClientSocket.Detach();
    
return CWinThread::ExitInstance();
}
问题: 如何得到每个线程中的ClientSocket的对象实例的指针?
因为用CArchive实现串行化时需要定义CSocketFile的对象,而且该对象必须关联到相关的Socket上,如:
CSocketFile file(/*这里就需要一个CSocket派生类的指针*/);
如果是接收的时候都好办,只要在OnReceive()里面定义:CSocketFile file(this);就可以了,但是发送的时候不知道怎么得到我想发送的那个ClientSocket的对象实例的指针.
  请各位大侠帮忙分析一下,谢谢.

解决方案 »

  1.   

    在ConnectThread里加入ClientSocket *m_pClientSocket 变量。
    ConnectThread->m_pClientSocket  = m_connection[nSocket]
    不就行了吗
      

  2.   

    sorry 
    it should be 
    ConnectThread->m_pClientSocket  = &(m_connection[nSocket])
      

  3.   

    将ConnectThread中的ClientSocket m_ClientSocket变量申明为公有变量,需要时先判断线程是否在运行,m_ClientSocket是否有效,然后直接可以使用啊!!!
      

  4.   

    还有个方法就是你在ClientSocket中编写发送的代码,不是就可以利用this了吗!!只要申明为公有即可!!!
      

  5.   

    发送时用哪个实例执行send操作就是你所要的对象
      

  6.   

    为每个连接都创建一个线程不太好吧,设想有上千个请求怎么办,不如用完成端口(completion port)
      

  7.   

    1) 最大请求可以限制.
    2) ConnectThread里有ClientSocket对象,是用来Attach socket的,这样才能把每个socket对应到每个线程啊.
    3) 不能用send,因为用的是CArchive串行化收发
    4) 就算是在ClientSocket中编写发送代码,但是我不知道需要发送的那个实例究竟是哪个啊.我就是想对应每个客户端IP把用于连接它的ClientSocket的实例保存起来,但是不知道在哪获取.请大家仔细分析分析.
      

  8.   

    ConnectThread->m_hSocket=(SOCKET)m_connection[nSocket].Detach();
    这句不明白!