【发布时间】:2015-09-21 18:57:35
【问题描述】:
所以我只是使用 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);
}
客户端的线程然后检查客户端是否发送了某些内容,然后将其发送到服务器。它还检查客户端是否仍然连接。 无效客户端::tick(){
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 - abort() 已被调用
所有调试都显示这是我的错误:
switch (_CrtDbgReportW(_CRT_ERROR, NULL, 0, NULL, L"%s", error_text)){
case 1: _CrtDbgBreak(); msgshown = 1; break;
case 0: msgshown = 1; break;
}
所以是的,我真的不知道是什么导致了这次崩溃,但是我怀疑它可能与使用客户端功能的线程有关,该功能基本上被删除,因为它正在从服务器的客户端向量中删除。
如果这是问题所在,你们能否给我一些想法,以更好地实现每个客户端都有自己的线程?
编辑:更改了矢量错误,但是一旦客户端断开连接,崩溃仍然会发生
【问题讨论】:
-
&Client()评估为指向右值的指针,只有在使用不符合标准的编译器时才有可能。不要那样做。 -
所以我应该改用法线向量?
-
All debugging shows me is this as my error真的是这样吗?你检查调用堆栈了吗?您是否尝试使用try/catch封装一些代码?您是否尝试评论server->removeClient(this);以查看它是否停止崩溃? -
为什么会有一个指针向量?
Client对象应该在什么时候被销毁?不清楚你为什么要做你正在做的事情,这让你很难告诉你做这件事的正确方法。 -
我假设 Client 对象在方法“server->removeClient(this);”后立即被销毁被调用并且客户端对象被从向量中移除。 (因为我不会将客户保存在其他任何地方)
标签: c++ multithreading sockets winsock