C предупреждение: присваивание делает целое число из указателя без приведения / указатель на массив целых - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь создать чат с использованием TCP / IP на C, но каждый новый клиент - это новый поток. Клиенты должны общаться друг с другом с сервером. У меня проблема при создании новой темы.

При вызове pthread_create(&thread_id, NULL, messenger, (void*)client_socket) я пытаюсь передать дескриптор сокета нового клиента и добавить его в массив целых чисел. Но что бы я ни пытался, я получаю это предупреждение:

присваивание делает целое число из указателя без приведения

Вот код, с которым у меня проблемы. В функции main есть глобальная переменная int, которая называется users:

users = 0;
int new_socket;
int *clinet_socket;

new_socket = accept(master_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen);
client_socket = &new_socket;

pthread_create(&thread_id, NULL, messenger, (void*)client_socket)

Вот функция messenger:

void *messenger(void *sockel){
   unsigned int (*sockerde)[30];

   (*sockerde)[users] = (unsigned int(*))&sockel;
   users++;
}

Смысл в том, чтобы сохранить массив с дескрипторами сокетов всех подключенных клиентов, чтобы использовать его позже.

1 Ответ

1 голос
/ 10 апреля 2019

Проблема, с которой у вас проблемы, - это наименьшая из ваших проблем.

  • Вы не делаете проверки ошибок.
  • Вы передаете значение сокета по ссылке, но вы никоим образом не гарантировали, что значение new_socket останется стабильным до того, как новый поток его получит.
  • вы назначаете через указатель массива unsigned int (*sockerde)[30];, который никуда не указывает!
  • вы обращаетесь к глобалу из нескольких потоков без какой-либо синхронизации

и наконец

  • вы преобразуете адрес локального параметра (нет смысла делать это) в unsigned int*, используя странный стиль скобок, а затем вы пытаетесь назначить его через недопустимый указатель на unsigned int, который что вызывает ошибку типа.

Может, забрать книгу?

...