在网上找了一大圈, 发现linux通过指定网卡发送 数据,基本有2个途径,
1, 通过建立SOCKET的时候就绑定网卡,SO_BINDTODEVICE
2. 建立原始套接字。SOCK_RAW, 填充指定网卡的mac地址发送。
依然没有达到我的要求,我的要求是UDP既然是面向无连接的,我只建立一个UDP,不绑定任何IP地址,但是我发送UDP数据的时候指定从某一个网卡发, 这要怎么做呢?
#include <stdio.h>;
#include <string.h>;
#include <sys/socket.h>;
#include <netpacket/packet.h>;
#include <net/ethernet.h>;
#include <sys/ioctl.h>;
#include <net/if.h>;
#include <assert.h>;
int
main ()
{
struct sockaddr_ll sll;
int fd;
struct ifreq ifr;
char *dev;
fd = socket (PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
dev = "eth0";
strncpy ((char *)ifr.ifr_name, dev, sizeof(ifr.ifr_name));
assert (ioctl (fd, SIOCGIFINDEX, &ifr)==0);
memset (&sll, 0, sizeof(sll));
sll.sll_family = AF_PACKET;
sll.sll_protocol = htons (ETH_P_ALL);
sll.sll_ifindex = ifr.ifr_ifindex;
assert (bind (fd, (struct sockaddr *)&sll, sizeof(sll))==0);
}
230509这种方法肯定是可行的,不过不够方便灵活,用的过程中发现个更好的办法,不过不是适用于所有的场合,要看情况,方法如下:
增加固定路由,比如我的2个网口,一个10.x.x.x 一个172.x.x.x,通增加172网段的固定路由就可以解决172地址的路由问题。10网段可以增加个默认路由
route add -net 172.16.0.0 netmask 255.255.0.0 dev ppp1
route add default dev pp0