【问题标题】:abort() has been called on winsock recv() method已在 winsock recv() 方法上调用 abort()
【发布时间】:2020-06-04 05:23:15
【问题描述】:

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

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

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

完成此操作后,我启动接收线程。 (本文第一段代码)

【问题讨论】:

  • 需要更完整的样本。
  • 你需要什么?在 recv() 方法之后被调用的东西?我在 recv() 行放了一个断点,这就是它崩溃的地方。
  • ConnectSocket是如何初始化的? recvbufrecvbuflen 放在哪里?监听线程的代码?
  • 我希望我添加的足够多?
  • 似乎你的对象在recv 调用的那一刻被破坏了,当recv 试图向你的缓冲区写入一些东西时你只是有访问冲突。 Base 的实例是在哪里创建的?

标签: c++ winsock


【解决方案1】:

打电话

receiveThread.detach();

创建线程后。因为它会在范围退出时被删除。

【讨论】:

    【解决方案2】:

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

    你有两个选择:

    1. 调用receiveThread.detach() 将该对象切断到线程,从而使其不可连接,因此当它被销毁时不会发生任何坏事。
    2. 如果您想稍后加入线程,然后使用 new 在堆上分配它 - 将其指针存储在某处,以便稍后您可以加入它然后删除它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多