简单的套接字侦听器和线程内存泄漏

时间:2013-12-04 01:17:21

标签: 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;
}

1 个答案:

答案 0 :(得分:0)

我在套接字关闭行之后插入了pthread_detach(pthread_self()),它不再有问题了。 - sudo