我试图从我正在构建的服务器上接收消息。
在某一时刻,当客户端连接到服务器时,我启动了一个接收线程,它不断地运行。
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.
我不知道如何解决这个问题,也不知道问题出在哪里。
EDIT.这里有一些额外的代码来显示。
这里有一些额外的代码来展示socket是如何创建的,等等。(我省略了大部分的错误检查)
recvbuf和recvbuf的声明如下。
int recvbuflen;
char recvbuf[512];
然后在构造函数中, recvbuflen的声明如下:
Base::Base(void):
recvbuflen(512)
{
...
}
下面是我创建socket对象的过程
// 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);
完成后,我启动接收线程。(本帖的第一段代码)
呼叫
receiveThread.detach();
创建一个线程后。因为它在范围退出时被删除,否则。
这里的问题是,创建receiveThread对象的方法返回了,导致receiveThread对象被销毁。因为receiveThread是可连接的,那么当它被销毁时,它就会调用terminate(),从而给你带来错误。
你有两个选择。
receiveThread.detach()
将这个对象与线程分离,从而使其不可加入,所以当它被销毁时,不会发生任何坏事。