UDP多网卡广播问题解决方案
Linux
class UDPSender
{
public:
UDPSender()
{
m_sock=-1;
}
~UDPSender(){}
bool SetRecvAddr(const char* addr,int port)
{
int sock=socket(AF_INET,SOCK_DGRAM,0);
if(sock<0)
{
cout<<"socket init error!"<<endl;
return false;
}
sockaddr_in addrSrv;
addrSrv.sin_addr.s_addr=inet_addr(addr);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(port);
if((addrSrv.sin_addr.s_addr>>24)==0xff)//if addr end with 255 then broadcast
{
GetLocalIP();
isBroadCast=true;
string local=findlocalIp(addr);
if(local.compare("")==0)
{
cout<<"find local ip error!"<<endl;
return false;
}
sockaddr_in addrSrvLocal;
addrSrvLocal.sin_addr.s_addr=inet_addr(local.c_str());
addrSrvLocal.sin_family=AF_INET;
addrSrvLocal.sin_port=0;//unuse
if(bind(sock,(sockaddr *)&addrSrvLocal,sizeof(addrSrvLocal))!=0)
{
cout<<"bind local ip error!"<<endl;
return false;
}
int opval=1;
addrSrv.sin_addr.s_addr=htonl(INADDR_BROADCAST);
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&opval,sizeof(opval));
}
m_sock=sock;
m_sockaddr=addrSrv;
return true;
}
void Send(char* buf,int bufsize)
{
sendto(m_sock,buf,bufsize,0,(struct sockaddr*)&m_sockaddr,sizeof(sockaddr));
}
private:
void GetLocalIP()
{
FILE *fstream=NULL;
char buf[128];
memset(buf,0,sizeof(buf));
string cmd="/sbin/ifconfig |grep \"inet addr\"|awk \'{print $2}\'|awk -F \':\' \'{print $2}\'";// cmd: /sbin/ifconfig |greo "inet addr"|awk '{print $2}'|awk -F ':' '{print $2}'
if(NULL==(fstream=popen(cmd.c_str(),"r")))
{
cout<<"ifconfig exec error"<<endl;
return;
}
while(NULL != fgets(buf,sizeof(buf),fstream))
{
buf[strlen(buf)-1]='\0';//erase \n
LocalIP.push_back(buf);
}
return;
}
string findlocalIp(string BCast)
{
if(LocalIP.size()==0)
{
cout<<"local ip empty"<<endl;
return "";
}
int pos=BCast.find_first_of(".");
if(pos<0)
{
cout<<"distination IP address format error!"<<endl;
return "";
}
BCast[pos]=0;//compare first byte
vector<string>::iter it=LocalIP.begin();
for(;it!=LocalIP.end();it++)
{
string local=*it;
pos=local.find_first_of(".");
if(pos<0)
{
cout<<"local IP address format error"<<endl;
return "";
}
local[pos]=0;
if(strcmp(BCast.c_str(),local.c_str())==0)
{
return *it;
}
}
return "";
}
vector<string> LocalIP;
bool isBroadCast;
int m_sock;
sockaddr_in m_sockaddr;
}
void main()
{
UDPSender sender1,sender2;
if(sender1.setRecvAddr(“192.168.23.255”,9999)==true)
{
cout<<“BroadCasting 192.168.23 …”
Sender.Send(“hello”,sizeof(“hello”));
}
if(sender2.setRecvAddr(“10.20.30.255”,9998)==true)
{
cout<<“BroadCasting 10.20.30 …”
Sender2.Send(“hello”,sizeof(“hello”));
}
return;
}
Windows 获取所有IP
// GetIPs.cpp : Defines the entry point for the console application.
//
#include “stdafx.h”
#include <atlstr.h>
#include <IPHlpApi.h>
//#include <WinSock2.h>
#include
//#pragma comment(lib, “ws2_32.lib”)
#pragma comment(lib, “Iphlpapi.lib”)
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CString szMark;
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
pAdapterInfo = ( IP_ADAPTER_INFO * ) malloc( sizeof( IP_ADAPTER_INFO ) );
ULONG ulOutBufLen;
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// 第一次调用GetAdapterInfo获取ulOutBufLen大小
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
{
pAdapter = pAdapterInfo;
while (pAdapter)
{
PIP_ADDR_STRING pIPAddr;
pIPAddr = &pAdapter->IpAddressList;
while (pIPAddr)
{
cout << "IP:" << pIPAddr->IpAddress.String << endl;
cout << "Mask:" << pIPAddr->IpMask.String << endl;
cout << endl;
pIPAddr = pIPAddr->Next;
}
pAdapter = pAdapter->Next;
}
}
getchar();
return 0;
}