«lvalue требуется как унарный» & «операнд» в системном вызове socket () - PullRequest
4 голосов
/ 04 июня 2011

Я пишу сетевую программу, в которой в серверной части я хочу принимать соединения от нескольких клиентов, используя прослушивающий сокет. Поэтому я объявляю массив структур адресов следующим образом:

struct sockaddr_in* client;

, который я создаю, используя malloc и позже, чтобы принимать соединения, которые я печатаю:

newsock = accept(fd_skt, (struct sockaddr *)&client[i], &(sizeof(client[i])));

и там я получаю "lvalue required as unary '&' operand" от компилятора. Кто-нибудь может понять, что я сделал не так?

Ответы [ 2 ]

11 голосов
/ 04 июня 2011

Да, вы не можете взять адрес чего-то, что не является lvalue , то есть объектом с адресом.Результат оператора sizeof - это просто значение, это не объект с адресом.

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

Например,

socklen_t addrlen = sizeof client[i];
newsock = accept(fd_skt, (struct sockaddr *)&client[i], &addrlen));

Кроме того, struct sockaddr_in* client; объявляет указатель, а не массив.Чтобы использовать client в качестве массива, вам нужно назначить его динамически распределенному массиву в некоторый момент перед вызовом accept.Я предполагаю, что это то, что вы делаете, когда говорите: «Я создаю, используя malloc».

В качестве альтернативы вы можете фактически объявить client как массив.

struct sockaddr_in client[MAX_CLIENTS];
2 голосов
/ 04 июня 2011

Ответ Чарльза верен, но один из способов обойти этот вид интерфейса отвратительной функции, который требует указатель на значение, которое вы планируете просто выбросить, - это использование составных литералов:

newsock = accept(fd_skt, (struct sockaddr *)&client[i], (socklen_t[]){sizeof client[0]});
...