NIC の MAC address を取得するも失敗
TCP や UDP の Socket は一通り書いてみたので、今度は RawSocket に挑戦したい。
TCP や UDP では、L2 や L3 のヘッダはおろか、TCP のヘッダも完全にお任せ。意識するのは Payload のみでよかった。だが、RawSocket ではそうも行かない。手始めに指定した NIC(interface) の MAC address を取得してみようと思う。
#include <arpa/inet.h> #include <errno.h> #include <linux/if_ether.h> #include <net/if.h> // ifr #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> // ioctl #include <sys/types.h> #include <sys/socket.h> int main(int argc, char **args){ int fd, status; struct ifreq ifr; fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if( fd < 0 ){ perror("socket() failed.\n"); exit(EXIT_FAILURE); } // Access to NIC and get information memset(&ifr, 0, sizeof(ifr)); snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", args[1]); status = ioctl(fd, SIOCGIFHWADDR, &ifr); if( status < 0 ){ perror("ioctl() failed to get source MAC address.\n"); exit(EXIT_FAILURE); } close(fd); printf("%s\n", ifr.ifr_hwaddr.sa_data); return 0; }
これでうまくいくかと思いきや、文字化け。何が悪いのだろうか・・・