python通过指定网卡发包_windows下用UDP 广播在特定网卡上发包
背景
总结
通过路由表来达到在指定网卡上发包的效果。
解决方案
更改路由表
使用python的pysnmp库更方便
这里给出的是windows自带的dos命令
route change 255.255.255.255 mask 255.255.255.255 192.168.1.101 metric 230 if 22
其中 192.168.1.101 是你本机的IP地址
metric 230 是你决定的metric值,比其他的小就行
if 22 是无线网络接口编号,也是通过route print命令看出来的
得到无线网卡信息之后,在特定网络广播(192.168.1.255)而不使用255.255.255.255
main.c
#include
#include
#include "GetNICMsg.h"
void raise_message(char *msg);
char * changeIPaddrtoBroadcastIPaddr(char *ipaddr, char *netmask);
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
#define RECV_PORT 2019
#define SEND_PORT 2019
#define MAXBUFLEN 1024
#define DONTPRINTIT 0
#define PRINTIT 1
#define FIRST_USING_WIRELESS_NIC 0
int main()
{
WSADATA wsa;
WSAStartup(0x201, &wsa);
SOCKET sock_host;
sock_host = socket(AF_INET, SOCK_DGRAM, 0);
BOOL bBoardcast = TRUE;
if (SOCKET_ERROR == setsockopt(sock_host, SOL_SOCKET, SO_BROADCAST, (char*)&bBoardcast, sizeof(bBoardcast)))
{
printf("setsockopt failed with error code: %d/n", WSAGetLastError());
return -1;
}
char *ipaddr = NULL, *netmask = NULL,*ip_broadcast;
if (getAllAdapterInfo(&ipaddr, &netmask, MIB_IF_TYPE_WiFi, DONTPRINTIT, FIRST_USING_WIRELESS_NIC)!= 0)
{
raise_message("找不到一个可用的无线网卡\n");
closesocket(sock_host);
return -1;
}
// 获得无线网卡的广播地址
ip_broadcast = changeIPaddrtoBroadcastIPaddr(ipaddr, netmask);
sockaddr_in addr_local, addr_remote;
addr_remote.sin_addr.S_un.S_addr = inet_addr(ip_broadcast);
addr_remote.sin_port = htons(SEND_PORT);
addr_remote.sin_family = AF_INET;
int retval, headlen = sizeof(addr_remote);
char buf[MAXBUFLEN] = "hello???";
int ID_list_temp[5] = { htons(1), htons(2), htons(4), htons(8), htons(16) };
while (1)
{
for (int i = 0; i < 5; ++i)
{
retval = sendto(sock_host, (char *)(ID_list_temp + i), sizeof(int), 0, (sockaddr *)&addr_remote, headlen);
if (retval < 0)
{
retval = WSAGetLastError();
return -1;
}
}
}
return 0;
}
void raise_message(char *msg)
{
printf(msg);
}
char * changeIPaddrtoBroadcastIPaddr(char *ipaddr,char *netmask)
{
unsigned long int ipaddr_int = inet_addr(ipaddr);
unsigned long int netmask_int = inet_addr(netmask);
unsigned long int netmask_low = inet_addr("255.255.255.255");
netmask_low = netmask_low^netmask_int;
ipaddr_int = ipaddr_int | netmask_low;
char *ipbroadcast;
in_addr ipaddr_in;
ipaddr_in.S_un.S_addr = ipaddr_int;
ipbroadcast = inet_ntoa(ipaddr_in);
return ipbroadcast;
}
GetNICMsg.cpp
#include "GetNICMsg.h"
void GetMsgfromcur(char** ipaddr, char **netmask,PIP_ADAPTER_INFO cur, bool printit)
{
IP_ADDR_STRING *pIpAddrString = &(cur->IpAddressList);
if (printit)
{
cout << "IP:" << pIpAddrString->IpAddress.String << endl;
cout << "子网掩码:" << pIpAddrString->IpMask.String << endl;
cout << "Context:" << pIpAddrString->Context << endl;
char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
// mac 地址一般6个字节
// mac 二进制转16进制字符串
char macStr[18] = { 0 };//12+5+1
int k = 0;
for (int j = 0; j < cur->AddressLength; j++){
macStr[k++] = hex[(cur->Address[j] & 0xf0) >> 4];
macStr[k++] = hex[cur->Address[j] & 0x0f];
macStr[k++] = '-';
}
macStr[k - 1] = 0;
cout << "MAC:" << macStr << endl; // mac地址 16进制字符串表示
cout << "--------------------------------------------------" << endl;
}
*ipaddr = (char *)malloc(sizeof(IP_ADDRESS_STRING));
strcpy(*ipaddr, pIpAddrString->IpAddress.String);
*netmask = (char *)malloc(sizeof(IP_ADDRESS_STRING));
strcpy(*netmask, pIpAddrString->IpMask.String);
}
int getAllAdapterInfo(char** ipaddr, char **netmask, int NICtype, bool printit, int sequence)
{
if (sequence == 0)
sequence = 1;
int CurrentSequence = 1;
//char *ipaddr = (char *)malloc(sizeof(IP_ADDRESS_STRING));
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO[ADAPTERNUM];// 20个网卡空间 足够了
unsigned long stSize = sizeof(IP_ADAPTER_INFO) * ADAPTERNUM;
// 获取所有网卡信息,参数二为输入输出参数
int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
// 空间不足
if (ERROR_BUFFER_OVERFLOW == nRel) {
// 释放空间
if (pIpAdapterInfo != NULL)
delete[] pIpAdapterInfo;
return -1;
}
PIP_ADAPTER_INFO cur = pIpAdapterInfo;
// 多个网卡 通过链表形式链接起来的
while (cur){
if (cur->Type == NICtype)
{
switch (cur->Type) {
case MIB_IF_TYPE_OTHER:
break;
case MIB_IF_TYPE_ETHERNET:
GetMsgfromcur(ipaddr, netmask,cur, printit);
if (strcmp(UeslessIPaddr, *ipaddr) != 0)
{
if (CurrentSequence == sequence)
return 0;
else
++CurrentSequence;
}
break;
case MIB_IF_TYPE_TOKENRING:
break;
case MIB_IF_TYPE_FDDI:
break;
case MIB_IF_TYPE_PPP:
break;
case MIB_IF_TYPE_LOOPBACK:
break;
case MIB_IF_TYPE_SLIP:
break;
case MIB_IF_TYPE_WiFi:
GetMsgfromcur(ipaddr, netmask, cur, printit);
if (strcmp(UeslessIPaddr, *ipaddr) != 0)
{
if (CurrentSequence == sequence)
return 0;
else
++CurrentSequence;
}
break;
default://无线网卡,Unknown type
break;
}
}
cur = cur->Next;
}
// 释放空间
if (pIpAdapterInfo != NULL)
delete[] pIpAdapterInfo;
}
void getAllAdapterInfo()
{
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO[ADAPTERNUM];// 20个网卡空间 足够了
unsigned long stSize = sizeof(IP_ADAPTER_INFO) * ADAPTERNUM;
// 获取所有网卡信息,参数二为输入输出参数
int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
// 空间不足
if (ERROR_BUFFER_OVERFLOW == nRel) {
// 释放空间
if (pIpAdapterInfo != NULL)
delete[] pIpAdapterInfo;
return;
}
PIP_ADAPTER_INFO cur = pIpAdapterInfo;
// 多个网卡 通过链表形式链接起来的
while (cur){
cout << "网卡描述:" << cur->Description << endl;
switch (cur->Type) {
case MIB_IF_TYPE_OTHER:
break;
case MIB_IF_TYPE_ETHERNET:
{
IP_ADDR_STRING *pIpAddrString = &(cur->IpAddressList);
cout << "IP:" << pIpAddrString->IpAddress.String << endl;
cout << "子网掩码:" << pIpAddrString->IpMask.String << endl;
cout << "Context:" << pIpAddrString->Context << endl;
}
break;
case MIB_IF_TYPE_TOKENRING:
break;
case MIB_IF_TYPE_FDDI:
break;
case MIB_IF_TYPE_PPP:
break;
case MIB_IF_TYPE_LOOPBACK:
break;
case MIB_IF_TYPE_SLIP:
break;
default://无线网卡,Unknown type
{
IP_ADDR_STRING *pIpAddrString = &(cur->IpAddressList);
cout << "IP:" << pIpAddrString->IpAddress.String << endl;
cout << "子网掩码:" << pIpAddrString->IpMask.String << endl;
}
break;
}
char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
// mac 地址一般6个字节
// mac 二进制转16进制字符串
char macStr[18] = { 0 };//12+5+1
int k = 0;
for (int j = 0; j < cur->AddressLength; j++){
macStr[k++] = hex[(cur->Address[j] & 0xf0) >> 4];
macStr[k++] = hex[cur->Address[j] & 0x0f];
macStr[k++] = '-';
}
macStr[k - 1] = 0;
cout << "MAC:" << macStr << endl; // mac地址 16进制字符串表示
cur = cur->Next;
cout << "--------------------------------------------------" << endl;
}
// 释放空间
if (pIpAdapterInfo != NULL)
delete[] pIpAdapterInfo;
}
GetNICMsg.h
#ifndef __GETNICMSG__
#define __GETNICMSG__
#include
#include
#include
#include
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
using namespace std;
#define ADAPTERNUM 20
#define MIB_IF_TYPE_WiFi 71
#define UeslessIPaddr "0.0.0.0"
int getAllAdapterInfo(char** ipaddr, char **netmask, int NICtype, bool printit, int sequence);
void getAllAdapterInfo();
void GetMsgfromcur(char** ipaddr, char **netmask, PIP_ADAPTER_INFO cur, bool printit);
#endif
通过setsockopt函数确定在哪个网卡上发送
在windows下不可行,但是在Linux下可以通过setsockopt(..., SOL_SOCKET, SO_BINDTODEVICE, "ethX")完成。
参考https://stackoverflow.com/questions/683624/udp-broadcast-on-all-interfaces
python通过指定网卡发包_windows下用UDP 广播在特定网卡上发包相关推荐
- Python 读取指定目录及其子目录下所有文件名
Python 读取指定目录及其子目录下所有文件名 本文博客地址:https://xinancsd.github.io/Python/python_search_folder.html 目标 磁盘中的文 ...
- team网卡配置_Windows下的网卡Teaming 配置教程(图文)
Broadcom和Intel的网卡是我在服务器上见过最多的网卡,本篇记录这两个品牌网卡做Teaming的过程,关于Teaming这个词在不同的平台有不同叫法,在Linux下叫bonding,IBM称为 ...
- python2和python3分别是python的两个版本_Windows下Python2与Python3两个版本共存的方法详解...
前言 一向用Python 3,最近研究微信公众号开发,各云平台只支持Python 2.7,想用其他版本需要自己搭建环境.而网上又搜不到Python 3开发微信公众号的资料.暂打算先使用Python 2 ...
- python从指定文件夹导入模块_Python实现的在特定目录下导入模块功能分析
本文实例讲述了Python实现的在特定目录下导入模块功能.分享给大家供大家参考,具体如下: 方法1.在指定的目录下导入特定模块,(tab.py换行自动补齐语法模块) root@kali:~# ls / ...
- python虚拟环境 windows环境搭建_windows下安装Python虚拟环境virtualenvwrapper-win
1.安装 执行命令 pip install virtualenv 为了使用virtualenv更方便,可以借助 virtualenvwrapper 执行命令 pip install virtualen ...
- python虚拟环境 windows环境搭建_windows 下搭建python虚拟环境(示例代码)
################################### windows 下测试环境 C:\Users\wongg\django-cmdb>cd ..\cmdb ##下载get-p ...
- python的windows出现问题_Windows下使用python库 curses遇到错误消息的解决方案
在Windows系统下执行python应用时,有时会遇到错误信息: ModuleNotFoundError: No module named '_curses'. 然而查看Windows系统里pyth ...
- python操作hive数据库代码_windows下怎么用python连接hive数据库
展开全部 由于版本的不同,Python 连接 Hive 的方式也就不一样. 在网上搜索关键字 python hive 的时候可以找到一些解决方案.大部分是这3231313335323631343130 ...
- python环境变量的运用_Windows下python环境变量配置
默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设python的安装 ...
最新文章
- Cocos2d-X中实现菜单特效
- c++语言表白超炫图形_教你用C语言加图形库打造炫酷表白连连看
- linux centos7清除系统日志、历史记录、登录信息
- JAVA Swing——框架(JFrame、JDialog)位置居于父窗口中央的解决方案
- 7-1 作业调度算法--先来先服务 (30 分)(思路+详解+vector+map+map做法)Come Baby!!!!!!!!!!!
- android textview 背景图片,Android—TextView 背景颜色与背景图片设置
- 【NATS streaming】NATS streaming 简介与安装
- auth java_java – 使用auth的httpget请求
- 【PTAL2-001】紧急救援(Dijkstra+最短路径的条数+最短路径中点权之和的最大值)
- PHP中如何获取字符串的长度
- 苹果手机Apple ID 忘记密码 ,频繁跳出登录iCloud如何关闭
- CCF-CSP历年真题大全附题解(202209已更)
- 中文字符集与字符编码的基础知识
- 特征值、特征根、本征值
- R语言开放数据分析报告
- IOS开发-常用的第三方库
- OV7725之AL422B-FIFO及摄像头的驱动原理
- 操作系统与网络协议晦涩难懂,华为18级工程师神级文档助你过关
- python 读取gif_2020-09-11 python 读取gif文件并简单添加文字
- 和开源硬件相关的几个词,免费、山寨、创客教育,以及未来 | COSCon'18
热门文章
- MFC——文件打开和保存对话框(CFileDialog)
- android USB
- C++函数的传入参数是指针的指针(**)的详解
- c++中enum 如何使用
- Phython—实训day5—爬虫相关知识
- python向钉钉发送本地文件_Python实现向钉钉群发送消息通知
- 记录几款比较好用的jquery插件
- 小学计算机房简单介绍,介绍计算机教室的小学作文我们学校的机房
- osgText中的setAxisAlignment和setAlignment的区别
- 深入php内核,从底层c语言剖析php实现原理