【问题标题】:Simple Socket Listener and Threads Memory Leak简单的套接字侦听器和线程内存泄漏
【发布时间】:2013-12-20 07:52:39
【问题描述】:

我有一个简单的 C 程序,它应该监听连接并为每个连接的客户端启动一个新线程。该线程只是打印它收到的消息(现在)。我在制作这个时遵循了两个教程。

它有效,但我尝试使用 netcat 反复连接和断开连接,但没有发送任何消息。每次连接时,程序占用 8KB 内存,但断开连接时它只释放 4KB。但我找不到泄漏的原因。每次用户断开连接时,它都会结束线程并关闭套接字。以下是所有涉及的代码:

void* clientFunction(void* arg) {
    char receiveBuffer[RECEIVE_BUFFER_SIZE];
    long receiveSize;
    int clntSocket = * ((int*) arg);

    while (true) {
        //receive messages
        receiveSize = recv(clntSocket, receiveBuffer, RECEIVE_BUFFER_SIZE, 0);

        if (receiveSize <= 0) {
            close(clntSocket);
            return NULL;
        }

        printf("Received message: %s", receiveBuffer);
        memset(&receiveBuffer, 0, sizeof(receiveBuffer));
    }

    return 0;
}

int main(int argc, const char * argv[]) {
    //FOR LISTENING SOCKET =====
    int servSock;                    /* Socket descriptor for server */
    int clntSock;                    /* Socket descriptor for client */
    struct sockaddr_in serverAddress; /* Local address */
    struct sockaddr_in clientAddress; /* Client address */
    unsigned int clntLen;            /* Length of client address data structure */
    // =======

    /* Create socket for incoming connections */
    if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
        printf("Socket creation failed!\n");
        return SOCKET_ERROR;
    }

    memset(&serverAddress, 0, sizeof(serverAddress));   /* Zero out structure */
    serverAddress.sin_family = AF_INET;                /* Internet address family */
    serverAddress.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
    serverAddress.sin_port = htons(PORT);      /* Local port */

    if (bind(servSock, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {
        printf("Socket binding failed!\n");
        return SOCKET_ERROR;
    }

    if (listen(servSock, MAXPENDING) < 0) {
        printf("Socket listening failed!\n");
        return SOCKET_ERROR;
    }

    isListening = true;
    int* arg = &clntSock;

    while (isListening) { //should have a timer?
        /* Set the size of the in-out parameter */
        clntLen = sizeof(clientAddress);

        /* Wait for a client to connect */
        if ((clntSock = accept(servSock, (struct sockaddr *) &clientAddress, &clntLen)) >= 0) { //??????
            /* clntSock is connected to a client! */
            pthread_t clientThread;
            pthread_create(&clientThread, NULL, &clientFunction, (void*) arg);
        }
    }

    return 0;
}

【问题讨论】:

  • 看起来您可能需要调用 pthread_detach。
  • 您如何评估是否存在泄漏?可能是某些底层系统(还)没有放弃一些内存,以后可能会重用这些内存。您可以在简单的malloc 后跟free 上看到这种情况。最好的测试是运行程序一段时间,看看在每分钟建立 N 个连接时内存使用量是否线性增加。
  • 好的,我试试长跑测试。我不知道它会那样做。
  • 500 - 内部服务器错误也是正确的。默认情况下,这些线程是可连接的并持有一些资源。加入或分离它们。
  • 啊,是的,这就是解决方案。 500 - 内部服务器错误,因为您首先回答,您可以将其作为答案,如果您想要积分,我可以标记。我在套接字关闭行之后放入 pthread_detach(pthread_self()) ,它不再有问题了。

标签: c multithreading sockets memory-leaks


【解决方案1】:

我在套接字关闭行之后放入了 pthread_detach(pthread_self()) ,它不再有问题了。 – 须藤

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 2011-06-27
    • 2015-11-06
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2023-03-29
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多