gpt4 book ai didi

c++ - SIGABRT 在线程中访问内存时

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:24 25 4
gpt4 key购买 nike

我正在尝试用 C++ 制作 Linux tcp 服务器应用程序。我在每个客户端使用线程,并在线程中从客户端套接字接收数据,但在接收时我得到了 sigabrt。

我试图将缓冲区更改为 memset 但失败了。然后我尝试从线程外部创建缓冲区,但它也失败了。首先,我认为 recv 函数是一个问题,但是 memset 和简单的内存变化像 buffer[0] = 0;也得到 sigabrt。

void TcpServer::connectAction()
{
while (is_started) {
// Listen new connection from socket
if (listen(relay_socket, max_client) < 0) {
onError("Cannot listen from socket");
break;
}

// Accept connection from socket
sockaddr_in client_address_in;
int client_address_size = sizeof(client_address_in);
int client_socket = accept(relay_socket, reinterpret_cast<sockaddr*>(&client_address_in),
reinterpret_cast<socklen_t*>(&client_address_size));
if(client_socket < 0) {
onWarning("Client socket accept failed");
continue;
}

sockaddr *client_address = reinterpret_cast<sockaddr*>(&client_address_in);

clients[client_socket] = *client_address;

onNewClient(client_socket, *client_address);

thread client_thread(&TcpServer::listenAction, this, client_socket);

}
}

void TcpServer::listenAction(int client_socket)
{
while (is_started) {
uint8_t buffer[1024];

// This line gets SIGABRT
memset(&buffer, 0, 1024);

if(recv(client_socket, buffer, sizeof(buffer), 0) > 0)
onPayloadReceived(client_socket, reinterpret_cast<uint8_t*>(buffer));
}
}

最佳答案

我认为您应该分离线程,因为这会导致 SIGABRT。

所以,进入主线程后,

    thread client_thread(&TcpServer::listenAction, this, client_socket);

行,放入client_thread.detach();

原因是线程的析构函数会检查线程是加入还是分离。如果两者都不成立,它将调用 std::terminate()(这会导致中止)。

(所以这个问题与在客户端线程上访问buffer无关)

关于c++ - SIGABRT 在线程中访问内存时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57751691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com