【问题标题】:Does recvfrom() modify len?recvfrom() 是否修改 len?
【发布时间】:2017-12-23 16:06:08
【问题描述】:

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

【问题讨论】:

  • 想一想...为什么要将指向实际len 的指针传递给调用?

标签: c linux ip packet


【解决方案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参数不是空指针并且协议提供消息的源地址,则接收消息的源地址应存储在address指向的sockaddr结构中参数,这个地址的长度应该存储在address_len参数指向的对象中。

所以,它是状态设计,recvfrom() 将修改最后一个参数指向的值,提供

  • address 参数不是空指针
  • 协议提供消息的源地址

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多