crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Проверка соединения точка-точка на одной машине, тест сетевых адаптеров
MedEx
  опции профиля:
сообщение 11.5.2011, 11:09
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 11.2.2011
Пользователь №: 2403

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте!
Подскажите, на машине установлены несколько сетевых адаптеров, некоторые соединены точка-точка, некоторые подключены к хабу. Необходимо проверить пары точка-точка и внешнее подключение.
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 подключен к хабу

результат
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
MedEx
  опции профиля:
сообщение 18.5.2011, 10:18
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 11.2.2011
Пользователь №: 2403

Спасибо сказали: 0 раз(а)




Репутация:   0  


Опытным путём удалось установить , что пакеты адресованные адаптерам установленным на одной машине (TCP,UDP) отправляются сокету напрямую через драйвер. Если сокет забинден на адрес и порт и есть джоин на групповой адрес у отправителя и получателя, то пакет идёт на канальный уровень.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2024, 12:40