SIGABRT,同时在线程中访问内存

时间:2019-09-02 05:11:19

标签: c++ linux multithreading sockets

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

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

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

1 个答案:

答案 0 :(得分:0)

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

所以,进入主线程,在

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

行,放在client_thread.detach();

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

(因此问题与在客户端线程上访问buffer无关)

相关问题