已经在winsock recv()方法上调用了abort()

时间:2014-07-11 14:53:21

标签: c++ winsock

我正在尝试从我正在构建的服务器接收消息。

在某个时刻,当客户端连接到服务器时,我会启动一个不断运行的接收线程。 我从这个代码开始:

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);

完成此操作后,我启动接收线程。 (这篇文章中的第一段代码)

2 个答案:

答案 0 :(得分:2)

呼叫

receiveThread.detach();
创建线程后

。因为它会在范围退出时被删除。

答案 1 :(得分:0)

这里的问题是,创建了receiveThread对象的方法返回了,这导致了receiveThread对象被破坏。因为receiveThread是可连接的,所以当销毁它时,它将调用Terminate(),从而给您错误。

您有两个选择:

  1. 调用ImageDataGenerator将该对象切断到线程,从而使其无法连接,因此当销毁该对象时,不会发生任何不良情况。
  2. 如果以后要加入线程,则使用新线程将其分配到堆上-将其指针存储在某个位置,以便以后可以加入然后删除它。