socket绑定指定网卡发包

  • SO_BINDTODEVICE

网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题:
在多 IP/网卡主机上,UDP 包/协议会自动根据路由最优来选择从哪个网卡发数据包出去,即使你在此之前把该 SOCKET 绑定到了另一个网卡上。这样一来,如果你执行了绑定,则在 UDP 包中所代表的源 IP 字段可能不是你的数据包真正发出的地址。

比如:你有两个网卡分别为:A—192.168.1.100; B-192.168.2.100; mask-255.255.255.0

此时你如果将一 UDP 套接字 S 绑定到了 A 上,但是要发的目的地址为 192.168.2.110,这时包实际是从网卡 B 上发出去的(根据路由最优原则),但在包头的结构里面,由于 BIND 的缘故,可能指向的源地址为 A。这样源 IP 地址就产生了与实际不相符的错误。
要解决这种问题, 可以把套接字绑定到一个指定的网络设备, “eth0”, "ppp0"等.

示例1

int sock;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
memset(&ifr, 0x00, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", strlen("eth0"));
setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&ifr, sizeof(ifr));

示例2

int sock;
struct sockaddr_ll sl;
struct ifreq ifr;
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6));
memset(&sl, 0x00, sizeof(sl));
memset(&ifr, 0x00, sizeof(ifr));
sl.sll_family = AF_PACKET;
sl.sll_protocol = htons(ETH_P_IPV6);
strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
ioctl(fd, SIOCGIFINDEX, &ifr);
sl.sll_ifindex = ifr.ifr_ifindex;
bind(fd, (struct sockaddr *)&sl, sizeof(sl));

示例3

int sock;
struct sockaddr addr;
sock = socket(PF_PACKET, SOCK_PACKET, ETH_P_IP);
memset(&addr, 0x00, sizeof(addr));
addr.sa_family = PF_PACKET;
strncpy(addr.sa_data, "eth0", sizeof(addr.sa_data));
bind(sock, &addr, sizeof(addr));

SO_BINDTODEVICE

Bind this socket to a particular device like “eth0”, as specified in the passed interface name. If the name is an empty string or the option length is zero, the socket device binding is removed. The passed option is a variable-length null-terminated interface name string with the maximum size of IFNAMSIZ. If a socket is bound to an interface, only packets received from that particular interface are processed by the socket. Note that this only works for some socket types, particularly AF_INET sockets. It is not supported for packet sockets (use normal bind(8) there).

socket绑定指定网卡发包相关推荐

  1. python通过指定网卡发包_Python 使用指定的网卡发送HTTP请求的实例

    需求: 一台机器上有多个网卡, 如何访问指定的 URL 时使用指定的网卡发送数据呢? $ curl --interface eth0 www.baidu.com # curl interface 可以 ...

  2. python通过指定网卡发包_windows下用UDP 广播在特定网卡上发包

    背景 总结 通过路由表来达到在指定网卡上发包的效果. 解决方案 更改路由表 使用python的pysnmp库更方便 这里给出的是windows自带的dos命令 route change 255.255 ...

  3. python通过指定网卡发包_Python选择网卡发包及接收数据包

    当一台计算机上有多个网卡时,需要选择对应IP地址的网卡进行发送数据包或者接受数据包. 1.选择网卡发包(应用scapy): plface=conf.route.route("××.××.×× ...

  4. python 控制有线网卡_在Python中用socket捕获指定网卡的流量

    本文最后更新于2014年12月22日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! 指定连接到Internet的网卡: Get the IP address for the inte ...

  5. 飞鸽传书 绑定指定网卡

    如果有多个网卡(IP), 你可以将飞鸽传书与指定的网卡(IP)进行绑定. 命令格式如下(你可以在快捷方式上设置):  ipmsg.exe [端口] /NIC IP地址 D:\Users\adminis ...

  6. 双网卡服务器SOCKET编程指定客户端通信网卡

    网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题: 在多 IP/网卡主机上,UDP 包/协议会自动根据路由最优来选择从 ...

  7. 多网卡指定网卡发送数据

    环境: 2个网卡,分别在不同网络环境. 局域网一: 网关:10.9.16.254 电脑地址1:10.9.16.88 局域网二:网关:10.9.24.1 电脑地址2:10.9.24.88 要求: 通过 ...

  8. asio指定网卡加入组播组

    背景: rtsp客户端接收组播流,PC上存在多个网卡情况下,加入组播组时会选择默认的网卡加入,导致无法接收组播消息,即使抓包已经抓到组播的数据也接收不到. 上图中的IGMPv3消息如果不是由接收组播流 ...

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

    在网上找了一大圈, 发现linux通过指定网卡发送 数据,基本有2个途径, 1, 通过建立SOCKET的时候就绑定网卡,SO_BINDTODEVICE 2.   建立原始套接字.SOCK_RAW, 填 ...

最新文章

  1. 宝峰uv5r怎么设置信道_极蜂D301对讲机和宝峰UV5R 半月评
  2. java的throw_浅谈Java的throw与throws
  3. C++实现五子棋小游戏
  4. 解释汇编中的AUGW LABEL WORD、ADDW LABEL WORD
  5. Java图形编程实验总结_实验二java图形界面编程2015级.doc
  6. 2. PDO 的使用
  7. C# 使用 quartz.net 做定时任务
  8. Spark Streaming实例
  9. mysql 因单个表过大导致导入数据库失败
  10. 如何把计算机管理的服务删掉,如何将win7电脑服务列表中残留的服务选项删除掉?...
  11. 如何备份linux磁盘空间,请问怎么备份整个硬盘又快又省空间?
  12. amd的服务器cpu型号大全,AMD CPU型号大全
  13. 解决docker删除镜像时image is referenced in multiple repositories
  14. 泰山杯练习平台部分题目wp
  15. 计算机科学论文写作5-写硕士论文
  16. python爬虫十五:爬取12306火车票信息
  17. httpPrinter--vue--打印
  18. 2023年第二十届五一数学建模竞赛题目 C题详细思路
  19. 07 AVR单片机ATmega8工业总线项目的通信处理以及实现
  20. Chris and Magic Square

热门文章

  1. matlab ac电源,基于MATLAB对AC/DC/AC电源的死区效应的谐波分析及仿真
  2. mysql post 中文乱码_mysql/mariaDB中文乱码问题的处理
  3. python 对象创建_从Python中的基类对象创建对象
  4. 17原理图查找连接的管脚接口_第三节 主板原理图之标识的作用
  5. 魔戒(BFS+四维数组)
  6. Eddy的难题_JAVA
  7. 《深度探索C++对象模型》--7 站在对象模型的尖端
  8. 二叉树的先序/中序/后序(递归、非递归)+层序遍历
  9. 【Linux】11.将ubuntu电脑设置为一台可远程ssh或sftp访问的服务器
  10. Tomcat 部署项目的三种方法