【发布时间】: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是如何初始化的?recvbuf和recvbuflen放在哪里?监听线程的代码? -
我希望我添加的足够多?
-
似乎你的对象在
recv调用的那一刻被破坏了,当recv试图向你的缓冲区写入一些东西时你只是有访问冲突。Base的实例是在哪里创建的?