abort()被调用了winock recv()方法。

问题描述 投票:4回答:2

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

在某一时刻,当客户端连接到服务器时,我启动了一个接收线程,它不断地运行。

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

完成后,我启动接收线程。(本帖的第一段代码)

c++ winsock
2个回答
3
投票

呼叫

receiveThread.detach();

创建一个线程后。因为它在范围退出时被删除,否则。


0
投票

这里的问题是,创建receiveThread对象的方法返回了,导致receiveThread对象被销毁。因为receiveThread是可连接的,那么当它被销毁时,它就会调用terminate(),从而给你带来错误。

你有两个选择。

  1. 调用 receiveThread.detach() 将这个对象与线程分离,从而使其不可加入,所以当它被销毁时,不会发生任何坏事。
  2. 如果你想在以后加入线程,那么就在堆上用new分配它--把它的指针存储在某个地方,这样以后你就可以加入它,然后删除它。
© www.soinside.com 2019 - 2024. All rights reserved.