我正在编写一个网络程序,在服务器部分,我想使用监听套接字接受来自多个客户端的连接。所以我声明了一个像这样的地址结构数组:
struct sockaddr_in* client;
我使用malloc创建,稍后,接受我输入的连接:
newsock = accept(fd_skt, (struct sockaddr *)&client[i], &(sizeof(client[i])));
然后我从编译器得到"lvalue required as unary '&' operand"
。任何人都能弄清楚我做错了什么吗?
答案 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]});