背景

总结

通过路由表来达到在指定网卡上发包的效果。

解决方案

更改路由表

使用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 广播在特定网卡上发包相关推荐

  1. Python 读取指定目录及其子目录下所有文件名

    Python 读取指定目录及其子目录下所有文件名 本文博客地址:https://xinancsd.github.io/Python/python_search_folder.html 目标 磁盘中的文 ...

  2. team网卡配置_Windows下的网卡Teaming 配置教程(图文)

    Broadcom和Intel的网卡是我在服务器上见过最多的网卡,本篇记录这两个品牌网卡做Teaming的过程,关于Teaming这个词在不同的平台有不同叫法,在Linux下叫bonding,IBM称为 ...

  3. python2和python3分别是python的两个版本_Windows下Python2与Python3两个版本共存的方法详解...

    前言 一向用Python 3,最近研究微信公众号开发,各云平台只支持Python 2.7,想用其他版本需要自己搭建环境.而网上又搜不到Python 3开发微信公众号的资料.暂打算先使用Python 2 ...

  4. python从指定文件夹导入模块_Python实现的在特定目录下导入模块功能分析

    本文实例讲述了Python实现的在特定目录下导入模块功能.分享给大家供大家参考,具体如下: 方法1.在指定的目录下导入特定模块,(tab.py换行自动补齐语法模块) root@kali:~# ls / ...

  5. python虚拟环境 windows环境搭建_windows下安装Python虚拟环境virtualenvwrapper-win

    1.安装 执行命令 pip install virtualenv 为了使用virtualenv更方便,可以借助 virtualenvwrapper 执行命令 pip install virtualen ...

  6. python虚拟环境 windows环境搭建_windows 下搭建python虚拟环境(示例代码)

    ################################### windows 下测试环境 C:\Users\wongg\django-cmdb>cd ..\cmdb ##下载get-p ...

  7. python的windows出现问题_Windows下使用python库 curses遇到错误消息的解决方案

    在Windows系统下执行python应用时,有时会遇到错误信息: ModuleNotFoundError: No module named '_curses'. 然而查看Windows系统里pyth ...

  8. python操作hive数据库代码_windows下怎么用python连接hive数据库

    展开全部 由于版本的不同,Python 连接 Hive 的方式也就不一样. 在网上搜索关键字 python hive 的时候可以找到一些解决方案.大部分是这3231313335323631343130 ...

  9. python环境变量的运用_Windows下python环境变量配置

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设python的安装 ...

最新文章

  1. Cocos2d-X中实现菜单特效
  2. c++语言表白超炫图形_教你用C语言加图形库打造炫酷表白连连看
  3. linux centos7清除系统日志、历史记录、登录信息
  4. JAVA Swing——框架(JFrame、JDialog)位置居于父窗口中央的解决方案
  5. 7-1 作业调度算法--先来先服务 (30 分)(思路+详解+vector+map+map做法)Come Baby!!!!!!!!!!!
  6. android textview 背景图片,Android—TextView 背景颜色与背景图片设置
  7. 【NATS streaming】NATS streaming 简介与安装
  8. auth java_java – 使用auth的httpget请求
  9. 【PTAL2-001】紧急救援(Dijkstra+最短路径的条数+最短路径中点权之和的最大值)
  10. PHP中如何获取字符串的长度
  11. 苹果手机Apple ID 忘记密码 ,频繁跳出登录iCloud如何关闭
  12. CCF-CSP历年真题大全附题解(202209已更)
  13. 中文字符集与字符编码的基础知识
  14. 特征值、特征根、本征值
  15. R语言开放数据分析报告
  16. IOS开发-常用的第三方库
  17. OV7725之AL422B-FIFO及摄像头的驱动原理
  18. 操作系统与网络协议晦涩难懂,华为18级工程师神级文档助你过关
  19. python 读取gif_2020-09-11 python 读取gif文件并简单添加文字
  20. 和开源硬件相关的几个词,免费、山寨、创客教育,以及未来 | COSCon'18

热门文章

  1. MFC——文件打开和保存对话框(CFileDialog)
  2. android USB
  3. C++函数的传入参数是指针的指针(**)的详解
  4. c++中enum 如何使用
  5. Phython—实训day5—爬虫相关知识
  6. python向钉钉发送本地文件_Python实现向钉钉群发送消息通知
  7. 记录几款比较好用的jquery插件
  8. 小学计算机房简单介绍,介绍计算机教室的小学作文我们学校的机房
  9. osgText中的setAxisAlignment和setAlignment的区别
  10. 深入php内核,从底层c语言剖析php实现原理