“左撇子需要作为一元'&'操作数“在accept()套接字系统调用中

时间:2011-06-04 12:38:53

标签: c sockets compiler-errors

我正在编写一个网络程序,在服务器部分,我想使用监听套接字接受来自多个客户端的连接。所以我声明了一个像这样的地址结构数组:

struct sockaddr_in* client;

我使用malloc创建,稍后,接受我输入的连接:

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

然后我从编译器得到"lvalue required as unary '&' operand"。任何人都能弄清楚我做错了什么吗?

2 个答案:

答案 0 :(得分:11)

是的,您不能获取非左值的地址,即带有地址的对象。 sizeof运算符的结果只是一个值,它不是具有地址的对象。

您需要创建一个局部变量,以便获取其地址。

E.g。

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];

答案 1 :(得分:2)

查尔斯的答案是正确的,但是解决这种令人讨厌的函数接口的一种方法是使用复合文字:

需要指向你计划扔掉的值的指针。
newsock = accept(fd_skt, (struct sockaddr *)&client[i], (socklen_t[]){sizeof client[0]});