sendto()给我“无效参数”,因为len从20减去2个字节。 为什么调用recvfrom()会修改len?
s=socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
struct sockaddr_ll sll;
len=sizeof(sll);
bzero((char *)&sll, sizeof(sll));
sll.sll_ifindex=3;
rf=recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *) &sll, &len);
st=sendto(s, buf, 6+6+2+20+8+8, 0, (struct sockaddr *) &sll, len);
答案 0 :(得分:1)
语法:
ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags, struct sockaddr *restrict address, socklen_t *restrict address_len);
和
[...]如果
address
参数不是空指针且协议提供消息的源地址,则接收消息的源地址应存储在{指向的sockaddr结构中。 {1}}参数,该地址的长度应存储在address
参数指向的对象中。
因此,它的设计状态,address_len
将修改最后一个参数指向的值,前提是
recvfrom()
参数不是空指针