socket绑定指定网卡发包
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
socket绑定指定网卡发包相关推荐
- python通过指定网卡发包_Python 使用指定的网卡发送HTTP请求的实例
需求: 一台机器上有多个网卡, 如何访问指定的 URL 时使用指定的网卡发送数据呢? $ curl --interface eth0 www.baidu.com # curl interface 可以 ...
- python通过指定网卡发包_windows下用UDP 广播在特定网卡上发包
背景 总结 通过路由表来达到在指定网卡上发包的效果. 解决方案 更改路由表 使用python的pysnmp库更方便 这里给出的是windows自带的dos命令 route change 255.255 ...
- python通过指定网卡发包_Python选择网卡发包及接收数据包
当一台计算机上有多个网卡时,需要选择对应IP地址的网卡进行发送数据包或者接受数据包. 1.选择网卡发包(应用scapy): plface=conf.route.route("××.××.×× ...
- python 控制有线网卡_在Python中用socket捕获指定网卡的流量
本文最后更新于2014年12月22日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! 指定连接到Internet的网卡: Get the IP address for the inte ...
- 飞鸽传书 绑定指定网卡
如果有多个网卡(IP), 你可以将飞鸽传书与指定的网卡(IP)进行绑定. 命令格式如下(你可以在快捷方式上设置): ipmsg.exe [端口] /NIC IP地址 D:\Users\adminis ...
- 双网卡服务器SOCKET编程指定客户端通信网卡
网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题: 在多 IP/网卡主机上,UDP 包/协议会自动根据路由最优来选择从 ...
- 多网卡指定网卡发送数据
环境: 2个网卡,分别在不同网络环境. 局域网一: 网关:10.9.16.254 电脑地址1:10.9.16.88 局域网二:网关:10.9.24.1 电脑地址2:10.9.24.88 要求: 通过 ...
- asio指定网卡加入组播组
背景: rtsp客户端接收组播流,PC上存在多个网卡情况下,加入组播组时会选择默认的网卡加入,导致无法接收组播消息,即使抓包已经抓到组播的数据也接收不到. 上图中的IGMPv3消息如果不是由接收组播流 ...
- linux通过指定网卡发送 数据,实现方式
在网上找了一大圈, 发现linux通过指定网卡发送 数据,基本有2个途径, 1, 通过建立SOCKET的时候就绑定网卡,SO_BINDTODEVICE 2. 建立原始套接字.SOCK_RAW, 填 ...
最新文章
- 宝峰uv5r怎么设置信道_极蜂D301对讲机和宝峰UV5R 半月评
- java的throw_浅谈Java的throw与throws
- C++实现五子棋小游戏
- 解释汇编中的AUGW LABEL WORD、ADDW LABEL WORD
- Java图形编程实验总结_实验二java图形界面编程2015级.doc
- 2. PDO 的使用
- C# 使用 quartz.net 做定时任务
- Spark Streaming实例
- mysql 因单个表过大导致导入数据库失败
- 如何把计算机管理的服务删掉,如何将win7电脑服务列表中残留的服务选项删除掉?...
- 如何备份linux磁盘空间,请问怎么备份整个硬盘又快又省空间?
- amd的服务器cpu型号大全,AMD CPU型号大全
- 解决docker删除镜像时image is referenced in multiple repositories
- 泰山杯练习平台部分题目wp
- 计算机科学论文写作5-写硕士论文
- python爬虫十五:爬取12306火车票信息
- httpPrinter--vue--打印
- 2023年第二十届五一数学建模竞赛题目 C题详细思路
- 07 AVR单片机ATmega8工业总线项目的通信处理以及实现
- Chris and Magic Square
热门文章
- matlab ac电源,基于MATLAB对AC/DC/AC电源的死区效应的谐波分析及仿真
- mysql post 中文乱码_mysql/mariaDB中文乱码问题的处理
- python 对象创建_从Python中的基类对象创建对象
- 17原理图查找连接的管脚接口_第三节 主板原理图之标识的作用
- 魔戒(BFS+四维数组)
- Eddy的难题_JAVA
- 《深度探索C++对象模型》--7 站在对象模型的尖端
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- 【Linux】11.将ubuntu电脑设置为一台可远程ssh或sftp访问的服务器
- Tomcat 部署项目的三种方法