2017-07-18 33 views
-1

sendto()给我“无效的参数”,因为len从20减少20个字节。 为什么调用recvfrom()修改len?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); 
+5

想...为什么你要传递一个指向实际的'len'的指针? –

回答

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