Linux/Debian で RAW ソケットを使用していますが、sendto() の代わりに write() を使用すると問題が発生します。
struct sockaddr_ll socket_address;
/* Index of the network device */
socket_address.sll_ifindex = if_idx.ifr_ifindex;
/* Address length*/
socket_address.sll_halen = ETH_ALEN;
/* Destination MAC */
socket_address.sll_addr[0] = 0x00;
socket_address.sll_addr[1] = 0x11;
socket_address.sll_addr[2] = 0x22;
socket_address.sll_addr[3] = 0x33;
socket_address.sll_addr[4] = 0x44;
socket_address.sll_addr[5] = 0x55;
/* Send packet */
int b_written = 0;
if ( ( b_written = write(sockfd, sendbuf, tx_len,
(struct sockaddr*)&socket_address,
sizeof(struct sockaddr_ll))) < 0 )
/*
if ( ( b_written = sendto(sockfd, sendbuf, tx_len, 0,
(struct sockaddr*)&socket_address,
sizeof(struct sockaddr_ll))) < 0 )
*/
{
perror("Could not write socket...");
fprintf(stderr, "ERRNO = %d\n", errno);
exit(-1);
}
printf("Packet sent!, Bytes written = %d\n", b_written);
sendto の代わりに「write」を使用すると、「No such device or address」という perror が表示されます (errno=6、EXNIO として定義されています)。
「sendto」を使用しても問題はなく、パケットは「tcpdump -nettti eth0 '(ether dst host 00:11:22:33:44:55)」に表示されます。
man(sendto) によると、sendto はフラグを指定しない書き込みと同等です。「sendto」に使用する flags フィールドが「0」であるため、両方のシステム コールが同等であると推測します。
私は何が間違っているのでしょうか?両方の呼び出しが同等であることは正しいですか?