c - 简单套接字监听器和线程内存泄漏

标签 c multithreading sockets memory-leaks

我有一个简单的 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(pthread_self()) ,并且不再有问题。 –须藤

关于c - 简单套接字监听器和线程内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20365010/

相关文章:

c - 找不到 glib.h

.net - 关于 .Net 中的信号量类

c# - 失去通讯时Compact Framework上的问题

javascript - 为什么JS总是返回 'Cannot read property ' Push'of undefined'?

java - 无法使用 Thread.interrupt 在 Android 上停止进度条

c++ - 仅在监听套接字上使用选择?

c - 使用结构体在函数之间传递数组信息

c - int bar[10] 与 int (*bar)[10] 之间的区别

在 Mac UTF-8 上比较路径与特殊字符

c++ - 如何在 QT 中使用互斥锁定线程开始轮询?