linux通过指定网卡发送 数据,实现方式

36 篇文章 3 订阅

在网上找了一大圈, 发现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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值