recvfrom()修改len吗?

时间:2017-07-18 16:44:16

标签: c linux ip packet

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

1 个答案:

答案 0 :(得分:1)

quote the man page

  

语法:

 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()参数不是空指针
  • 协议提供消息的源地址