2017-07-18 3 views
-1

lenが20から2バイト減少するため、sendto()は "無効な引数"を返します。 なぜ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引数がNULLポインタでない場合とプロトコルは、ソースadd受信したメッセージの送信元アドレスは、address引数が指すsockaddr構造体に格納され、このアドレスの長さは、address_len引数が指すオブジェクトに格納されます。

だから、それはステータス・バイ・デザイン、recvfrom()は、最後の引数が指す値を変更しますです、

  • を提供address引数がNULLポインタ
  • されていないプロトコルは、送信元アドレスを提供メッセージの内容
関連する問題