2017-07-18 99 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參數不是一個空指針
  • 該協議提供的源地址的消息