2014-12-04 40 views
0

下面是接受客戶端的代碼...我只是添加了一點將它添加到池中,這是一個list<Client>Client是我自己的類,它是由(SOCKET, Char*)套接字和ip地址定義的。 addclient2pool()函數只是添加到列表中。然後我遍歷列表並通過存儲的套接字Client發送數據。C++自定義客戶端處理程序

while(true) { 
    ClientSocket = accept(ListenSocket, (struct sockaddr *) &n, &len); 
    if (ClientSocket == INVALID_SOCKET) { 
     printf("accept failed with error: %d\n", WSAGetLastError()); 
     closesocket(ListenSocket); 
     WSACleanup(); 
     return; 
    } 
    addClient2Pool(Client(ListenSocket, inet_ntoa(n.sin_addr))); 
} 

套接字似乎已經關閉,所以我不能發送消息... 10057。我很確定,我將套接字存儲到Client類的方式存在根本性錯誤,但我對C++不熟悉。

void messageHandler() { 
    int iSend; 
    char* charB = "hello!"; 
    while(true) { 
     for(ClientPool::iterator it = mainClientPool.begin(); it != mainClientPool.end(); ++it) { 
      Client c = *it; 
      SOCKET sock = c.getSocket(); 
      iSend = send(sock, charB, sizeof(charB),0); 
      if (iSend == SOCKET_ERROR) { 
       printf("send failed with error: %d\n", WSAGetLastError()); 
      } 
     } 
     Sleep(2000); 
    } 
} 

我用std::thread nameofthread(void)nameofthread.join();

回答

0

我看到你的代碼的幾個問題。

你傳入ListenSocketClient()時,你應該通過ClientSocket代替:

addClient2Pool(Client(ClientSocket, inet_ntoa(n.sin_addr))); 

如果您需要關閉以任何理由服務器,你應該先關閉任何活動的客戶端套接字。在你的榜樣,如果accept()失敗,將調用closesocket(ListenSocket)WSACleanup()不清除mainClientPool第一(我假設你~Client()解構客戶端套接字上調用closesocket()):

mainClientPool.clear(); // <-- add this 
closesocket(ListenSocket); 
WSACleanup(); 

當通過列表循環,您需要使用Client&參考deferencing迭代這樣你就不會做,當他們走出去的範圍是調用析構函數的Client對象的臨時副本時(從而關閉您的客戶端套接字):

Client &c = *it; // <-- add '&' 

您錯用sizeof()。由於charBchar*而不是char[],你需要使用strlen()代替:

iSend = send(sock, charB, strlen(charB), 0); 

最後,當send()(或任何其他套接字操作)失敗,則應關閉失敗的客戶端套接字,並從列表中刪除它。這意味着將您的for()循環變爲while()循環,因此您可以在循環時修改列表:

void messageHandler() { 
    ... 
    while(true) { 
     ... 
     ClientPool::iterator it = mainClientPool.begin(); 
     while (it != mainClientPool.end()) { 
      ... 
      if (iSend == SOCKET_ERROR) { 
       ... 
       it = mainClientPool.erase(it); 
      } else { 
       ++it; 
      } 
     } 
     ... 
    } 
    ... 
}