Подсчитать количество клиентов, подключенных к серверу с использованием сокета TCP / IP при программировании C - PullRequest
0 голосов
/ 14 января 2020

При программировании C мне нужно подсчитать количество клиентов, подключенных к моему серверу с использованием сокетов mutex и TCP / IP.

Это мой server.c исходный файл:

int numberOfClientsConnected = 0;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int main ()
{
    // ... creation, binding and listen ...

    while (1) {

        clientSocket = accept(serverSocket, (struct sockaddr*)&newAddress, &addrSize);


        pthread_mutex_lock(&mutex);

        numberOfClientsConnected++;

        pthread_mutex_unlock(&mutex);

        child = fork();

        if (child == 0) {

            close(serverSocket);

            while (1) {
                recv(clientSocket, buffer, 1024, 0);

                if (strcmp(buffer, ":exit") == 0) {
                    printf("%s:%d left\n", inet_ntoa(newAddress.sin_addr), ntohs(newAddress.sin_port));
                    pthread_mutex_lock(&mutex);

                    numberOfClientsConnected--;

                    pthread_mutex_unlock(&mutex);

                    break;
                }
                else {
                    printf("%s:%d wrote: %s\n", inet_ntoa(newAddress.sin_addr), ntohs(newAddress.sin_port), buffer);
                    printf("There are %d client(s) connected\n", numeroDiClientAttualmenteConnessi);
                    // Invio del messaggio
                    send(clientSocket, buffer, strlen(buffer), 0);
                }
            }

        }

    }

    close(clientSocket);

    return 0;
}

Как вы можете видеть на моем скриншоте:

Console messages

Если я проверю количество клиентов, подключенных с client1, оно всегда будет отображать мне «1»; если я проверю с client2, он всегда будет отображать «2». То есть количество подключенных клиентов зависит от того, с какого клиента я отправляю текст. В чем ошибка?

1 Ответ

1 голос
/ 14 января 2020

fork() создает новый процесс, а не новый поток. Переменные не разделяются между процессами. Ваш дочерний процесс получает копию переменной и видит только значение переменной, как было, когда она была разветвлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...