2016-02-18 60 views
0

我正在使用CSocket的客戶端/服務器廣播應用程序。客戶端連接到服務器OnAccept方法調用。在OnAccept方法中,我創建該類的對象並將該對象的指針存儲在向量中。我不能在CAsyncSocket :: OnClose()使用矢量

void ServerSocket::OnAccept(int nErrorCode) 
{ 
    ServerSocket * User = new ServerSocket; 
    temp->m_hSocket = INVALID_SOCKET; 
    Accept(*temp); 
    m_vConnectionObject.push_back(temp); 
    CSocket::OnAccept(nErrorCode); 
} 

而客戶收我的OnClose方法將被稱爲連接,但是當我試圖訪問該方法我的矢量,它表明我,我的向量是空的。

void ServerSocket::OnClose(int nErrorCode) 
{  
    CString cname,name; 
    UINT cport,port; 

    GetPeerNameEx(cname,cport); 

    int i=m_vConnectionObject.size();  //here i got "i= 0" 

    std::vector<ServerSocket *>::iterator it = (m_vConnectionObject).begin() ; 
    for (; it != m_vConnectionObject.end(); ++it) 
    { 
     (*it)->GetPeerNameEx(name,port); 
     if ((name==cname) && (port==cport)) 
     { 
      //erase code 
     } 
    } 

    CSocket::OnClose(nErrorCode); 

} 

我想訪問該向量來刪除斷開客戶端的指針。

+0

你的迭代器循環是錯誤的。當'erase(it)'返回時,迭代器'it'不再有效,並且你不能預先遞增它。相反,使用'while(it!= m_vConnectionObject.end()){... if(...)it = m_vConnectionObject.erase(it);其他++它;'。 – IInspectable

回答

0

您在服務器偵聽套接字的上下文中執行OnAccept,但您在客戶端套接字的上下文中執行OnClose。所以你在看兩個不同的向量。