因此,我使用winsock2和TCP編寫了一個簡單的多線程客戶端服務器應用程序。客戶端斷開後服務器應用程序崩潰
這裏是它如何工作的快速摘要:
的服務器主線程是一個無限循環接受客戶,然後也將它們添加到持有這樣的每一個連接的客戶端服務器矢量: (只添加在重要的東西我的問題)
std::vector <Client*> clients;
while (true){
clients.push_back(&Client(accept(serverSocket, NULL, NULL), this));
}
當一個新的客戶端連接到服務器,我們基本上建立與新客戶的插座和服務器本身作爲參數的新的客戶對象。
我的想法是給每個客戶端自己的線程,以便每個客戶端可以同時發送數據。
std::thread tickThread;
Client::Client(SOCKET socket,Server* server) :
isConnected(true),
socket(socket),
server(server)
{
tickThread = std::thread(&Client::tick,this);
}
客戶端線程,然後檢查是否客戶端發送的東西,然後將其發送到服務器。它還檢查客戶端是否仍然連接。 無效客戶::打勾(){
while (isConnected){
errorHandler = recv(socket, receivedData, 255, 0);
if (errorHandler == SOCKET_ERROR){
disconnect();
}
else {
//send received data to server
}
}
如果客戶端斷開,它告訴服務器從連接的客戶端載體刪除客戶端,然後設置「isConnected」布爾爲false,這樣線程可以退出其功能。
void Client::disconnect(){
isConnected = false;
server->removeClient(this);
}
這是它是如何工作的,但是隻要客戶端斷開再有錯誤的服務器崩潰:
R6010 - 中止()被調用
所有調試表明瞭我這是我的錯誤:
switch (_CrtDbgReportW(_CRT_ERROR, NULL, 0, NULL, L"%s", error_text)){
case 1: _CrtDbgBreak(); msgshown = 1; break;
case 0: msgshown = 1; break;
}
所以是的,我真的不知道什麼是導致此崩潰,但我懷疑這可能與線程使用的第一個功能e客戶端在從服務器的客戶端向量中刪除時基本上被刪除。
如果事實證明是問題,你們可以給我一個更好的方式來實現每個客戶端有自己的線程的想法嗎?
編輯:改變了矢量誤差,但是崩潰仍然只要客戶端斷開
'&Client()'計算出一個指向右值的指針,這個指針只有在你使用不合規的編譯器時纔有可能。不要這樣做。 –
所以我應該使用一個正常的向量呢? –
'所有的調試都顯示我這是我的錯誤'是真的嗎?你檢查了調用堆棧嗎?你嘗試用'try/catch'封裝一段代碼嗎?你有沒有嘗試評論'server-> removeClient(this);'看它是否會停止崩潰? – jpo38