背景
总结
通过路由表来达到在指定网卡上发包的效果。
解决方案
更改路由表
使用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] &#