昨日のメモの問題解決
L2でパケットを送信する場合は↓の様にしないと問題が出る場合がある。 Socket_Handle = socket( PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL));
と、していたが問題の原因はsendto()の引数にあった(汗
この部分に対応するように下記のようにプログラムしていたのが原因のようだ。
//パケットの受信 lngAPIReVal= sizeof(struct sockaddr_in); lngAPIReVal = sendto(Socket_Handle_Out, RecvBuffer, RecvBufferLen, MSG_DONTROUTE, (struct sockaddr *) &LAN_Addr, lngAPIReVal);
で、正解はこっち
memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, "eth0", IFNAMSIZ); ioctl(Socket_Handle_Out, SIOCGIFINDEX, &ifr); memset(&sll, 0, sizeof(sll)); sll.sll_ifindex = ifr.ifr_ifindex; lngAPIReVal = sendto(Socket_Handle_Out, RecvBuffer, RecvBufferLen, 0, (struct sockaddr *) &sll, sizeof(struct sockaddr_ll));
インターフェースの指定と構造体のサイズの指定が間違っていたらしい。