내가 쓰기 (사용할 때이 문제가)() : 리눅스 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 호스트 00 : 11 : 22 : 33 : 44 : 55)' '에 패킷이 표시됩니다.
man (sendto)에 따르면 sendto는 플래그를 지정하지 않고 쓰기와 동일합니다. "sendto"에 사용하는 플래그 필드가 '0'이기 때문에 두 시스템 호출이 동일하다고 생각합니다.
내가 뭘 잘못하고 있니? 두 통화가 동등한가요?
'write()'는 5 개의 매개 변수를 가질 수 없습니다. – nouney
해당 맨 페이지의 내용은 sendto()와 sendmsg() 사이의 유일한 차이점은 인수를 해당 함수에 전달하는 방법 인 것 같습니다. 링크 레이어 레벨 RAW 소켓에 대해 "sendmsg()"를 "sendto()"보다 사용하는 것이 더 적절한 이유는 무엇입니까? – Ricardo
원본 코드입니까? 당신은'쓰기'또는'보내기'를 의미 했습니까? 명사가 한 말은 맞습니다. 만약 그것이'send'라면, 당신은 비 연결 서비스를 위해 그것을 사용할 수 없습니다. 예 : SOCK_RAW – Aravind