1

嗨,我正在尝试使用原始套接字进行数据包注入,我在使用 ioctl 的 SIOCGIFINDEX 命令获取接口索引时遇到问题。我使用 ubuntu 12.04 作为我的操作系统。请帮助代码是:

int BindRawSocketToInterface(char *device, int rawsock, int protocol)
{
struct sockaddr_ll sll;
struct ifreq ifr;
bzero(&sll, sizeof(sll));
bzero(&ifr, sizeof(ifr));

/* First Get the Interface Index */

strncpy ((char*) ifr.ifr_name, device, IFNAMSIZ);
if ((ioctl(rawsock, SIOCGIFINDEX, &ifr))== -1)
{
printf ("Error getting interface index!\n");
exit(-1);
}

/* Bind our rawsocket to this interface */

sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(protocol);

if ((bind(rawsock, (struct sockaddr*)&sll,sizeof(sll)))== -1)
{
perror("Error binding raw socket to interface \n");
exit(-1);
}
return 1;
}
4

2 回答 2

3

这是一个例子:

http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/

我希望这有帮助

于 2013-02-23T08:32:32.233 回答
0

作为对搜索此类功能的任何人的提醒,我已经看到了此功能的许多变体,其中许多具有以下错误,因此它可能是一个需要警告的复制粘贴错误:

strncpy ((char*) ifr.ifr_name, device, IFNAMSIZ);

此行有一个OBOE(差一错误)和一个不必要的 char * 强制转换。

strncpy (ifr.ifr_name, device, sizeof ifr.ifr_name - 1);

应改为使用。

于 2020-05-31T04:02:55.280 回答