我正在尝试从我正在构建的服务器接收消息。
在某个时刻,当客户端连接到服务器时,我会启动一个不断运行的接收线程。 我从这个代码开始:
std::thread receiveThread(&NetworkingLib::Base::Receive, this);
从Receive()方法所在的同一类中的方法调用它。
之后它会进入Receive()方法但是在调用recv()方法时会崩溃(Winsock方法)。
if (ConnectSocket != INVALID_SOCKET)
{
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
...
}
但所有这些变量都包含工作值。 错误说:
R6010 - abort() has been called.
我不知道如何解决这个问题或可能是什么问题。
编辑:
这里有一些额外的代码来展示如何创建套接字等等。 (我遗漏了大部分错误检查)
recvbuf和recvbuf声明如下:
int recvbuflen;
char recvbuf[512];
在构造函数中,recvbuflen声明如下:
Base::Base(void):
recvbuflen(512)
{
...
}
以下是我创建套接字对象的方法:
// Create a SOCKET to connect to the server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
// Connect to server.
iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
完成此操作后,我启动接收线程。 (这篇文章中的第一段代码)
答案 0 :(得分:2)
呼叫
receiveThread.detach();
创建线程后。因为它会在范围退出时被删除。
答案 1 :(得分:0)
这里的问题是,创建了receiveThread对象的方法返回了,这导致了receiveThread对象被破坏。因为receiveThread是可连接的,所以当销毁它时,它将调用Terminate(),从而给您错误。
您有两个选择:
ImageDataGenerator
将该对象切断到线程,从而使其无法连接,因此当销毁该对象时,不会发生任何不良情况。