Есть raw socket.
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
length = recvfrom(s, buffer, BUF_SIZE, 0, NULL, NULL);
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE,
(void *)&ifr_tmp, sizeof(ifr_tmp)) < 0)
{
perror("SO_BINDTODEVICE failed");
}