Здравствуйте!
Подскажите, на машине установлены несколько сетевых адаптеров, некоторые соединены точка-точка, некоторые подключены к хабу. Необходимо проверить пары точка-точка и внешнее подключение.
1. Составил список IP адресов адептеров на машине.
2. Пытаюсь на адреса из списка послать броадкаст пакет от выбранного адаптера. Затем от следующего из списка и так до конца. По идее должен получиться список пар из тех кто принят пакет (соединённых точка-точка). В обработчик попадают все адаптеры даже не соединённые физически друг с другом. Видимо на уровне драйвера происходит переадресация не доходя до канального уровня. Делал примерно ту же задачу но на Builder C++ 2010, всё было легко и просто UDP сокет, мультикаст, отправка пакета по списку. В обработчике читаю от кого в сокете кому - составил пару и вывел на экран. Может дело именно в мультикасте?
Код на qt
**********************************
<*.h>
QList<QUdpSocket *> UdpSocketList;
**********************************
<*.cpp>
#include "mainwindow.h"
#include "ui_mainwindow.h"
//------------------------------------------------------------------------------------
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStringList items;
foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces())
{
if (interface.flags().testFlag(QNetworkInterface::IsRunning))
foreach (QNetworkAddressEntry entry, interface.addressEntries())
{
if ( interface.hardwareAddress() != "00:00:00:00:00:00"
&& entry.ip().toString().contains(".")
&& entry.ip().toString()!="127.0.0.1")
items << entry.ip().toString();
}
}
for(int i=0;i<items.size();i++)
{
QUdpSocket * udpSocketS = new QUdpSocket(this);
if(!udpSocketS->bind(QHostAddress(items[i]),9090+i,QUdpSocket::DefaultForPlatform))continue;
UdpSocketList << udpSocketS;
connect(UdpSocketList.back(), SIGNAL(readyRead()),this, SLOT(RecvDatagrams()));
}
}
//-------------------------------------------------------------------------------------------
MainWindow::~MainWindow()
{
delete ui;
for(int i=0;i<UdpSocketList.size();i++)
{
delete UdpSocketList[i];
}
}
//----------------------------------------------------------------------------
void MainWindow::B_Start()
{
QByteArray datagram;
datagram.resize(64);
for(int i=0;i<UdpSocketList.size();i++)
{
UdpSocketList[i]->writeDatagram(datagram.data(), datagram.size(),QHostAddress::Broadcast, 7);
for(int j=0;j<UdpSocketList.size();j++)
UdpSocketList[i]->writeDatagram(datagram.data(), datagram.size(),UdpSocketList[j]->localAddress(), 9090+j);
}
}
//обработчик получения пакета на udp сокет
void MainWindow::RecvDatagrams()
{
for(int i=0;i<UdpSocketList.size();i++)
while (UdpSocketList[i]->hasPendingDatagrams())
{
QByteArray datagram;
QHostAddress sender;
quint16 Port;
do {
datagram.resize(UdpSocketList[i]->pendingDatagramSize());
UdpSocketList[i]->readDatagram(datagram.data(), datagram.size(),&sender,&Port);
if(sender.toString()==UdpSocketList[i]->localAddress().toString())continue;
ui->TB_ViewText->addItem(QString("sender %1_%2 - %3_%4 resiver")
.arg(sender.toString())
.arg(Port)
.arg(UdpSocketList[i]->localAddress().toString())
.arg(UdpSocketList[i]->localPort()));
}
while (UdpSocketList[i]->hasPendingDatagrams());
}
}
**********************************
участвуют 3 адаптера :
1. 192.168.50.2 связан точка-точка с 192.168.50.3
2. 192.168.50.3 связан точка-точка с 192.168.50.2
3. 192.168.3.43 подключен к хабу
результат