我在Linux/Debian的RAW插槽工作,我有一個問題,當我使用write()代替的sendto():Linux的RAW插槽
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,我得到以下錯誤:「沒有這樣的設備或地址」(errno = 6,它被定義爲EXNIO)。
使用「sendto」我沒有問題,數據包顯示在「tcpdump -nettti eth0」(ether dst host 00:11:22:33:44:55)'「中。
根據man(sendto),sendto相當於一個沒有指定任何標誌的寫入。由於我用於「sendto」的標誌字段是'0',我猜這兩個系統調用是等價的。
我做錯了什麼?這兩個電話是否等同是否正確?
'write()'不能有5個參數。 – nouney
至於該手冊頁的內容,似乎sendto()和sendmsg()之間的唯一區別是如何將參數傳遞給這些函數。爲什麼使用「sendmsg()」而不是「sendto()」更適合鏈接層級的RAW套接字? – Ricardo
這是原始碼。你的意思是「寫」或「發送」。我想,諾尼說的是對的。如果它是'發送',那麼你不能使用它進行無連接服務,例如:SOCK_RAW – Aravind