Russian Qt Forum

Qt => Работа с сетью => Тема начата: Dmitry от Январь 28, 2015, 01:12



Название: Помогите ПЛЗ. Прием UDP
Отправлено: Dmitry от Январь 28, 2015, 01:12
Понимаю что тема вроде как изъезжена, но все равно ничего не пойму в чем проблема. НУ ОЧЕНЬ НУЖНО
Не могу понять почему не принимаются пакеты UDP?
Суть в следующем с ПЛИС посылаются UDP, Wireshark их ловит:
      1 0.000000000    192.168.1.2           192.168.1.1           UDP      60     Source port: 5125  Destination port: 5125
а программа совсем никак.
firewall отключил, пробовал и из под рута и так - все непочем.
Если запускать клиент и сервер на обном компе то все ок как по примеру из всех книг, а с ПЛИС вообще ни как
запускаюсь на Centos 7, Qt 5.4
Подскажите что тут не так
Код:
udpSocket = new QUdpSocket(this);
   
    udpSocket->bind(QHostAddress("192.168.1.1"),5125);
    connect(udpSocket, SIGNAL(readyRead()),
            this, SLOT(processPendingDatagrams()));
Заранее огромное спасибо!



Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: Old от Январь 28, 2015, 08:27
Код
C++ (Qt)
udpSocket->bind( QHostAddress::Any, 5125 );
// а лучше
udpSocket->bind( 5125, QUdpSocket::ShareAddress );
 


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: Dmitry от Январь 28, 2015, 14:37
Спасибо, но к сожалению Не прокатывает оба варианта,
Вообще если честно не могу понять в чем принципиальная разница при приеме UDP сервера и клиента на одной машине, а чем и почему не получается прослушать порт при подключении ПЛИС по Ethernet?

Какие могут быть еще варианты?


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: CuteBunny от Февраль 03, 2015, 13:13
Спасибо, но к сожалению Не прокатывает оба варианта,
Вообще если честно не могу понять в чем принципиальная разница при приеме UDP сервера и клиента на одной машине, а чем и почему не получается прослушать порт при подключении ПЛИС по Ethernet?

Какие могут быть еще варианты?

Если я не ошибаюсь, то при запуске сервера и клиента на одной машине, все происходит на loopback'е. Какие у вас там вообще есть еще сетевые интерфейсы? Может сервер шлет данные по-одному интерфейсу, а программа слушает на другом, а wireshark слушает на всех? Ну и netstat можно посмотреть при запущенном слушателе?


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: Hellraiser от Февраль 03, 2015, 15:11
WireShark не слушает пакеты на localhost: http://wiki.wireshark.org/CaptureSetup/Loopback


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: Bepec от Февраль 03, 2015, 16:02
Ну для начала шарк включает неразборчивый режим сетевушки и слушает все пакетики.

        
Код:
socket8202_ = new QUdpSocket;
connect( socket8202_, SIGNAL( connected()), SLOT(connected()));
connect( socket8202_, SIGNAL( disconnected()), SLOT(disconnected()));
connect( socket8202_, SIGNAL( error(QAbstractSocket::SocketError)), SLOT(error(QAbstractSocket::SocketError)));
connect( socket8202_, SIGNAL( readyRead()), SLOT(readyRead()));
socket8202_->bind(8202);

Вот такой вот код спокойно принимал данные с ПЛИС.

Компьютер посылал ПЛИС дополнительный udp запрос - насколько я помню что то типа запроса имени, на что плис отвечала молчанием и udp пакет отбрасывался. Оо вспомнил. Запрашивался мак адрес карточки. Но плисина на это не рассчитывалась.

Собственно было и решение проблемы - вот такой вот bat файл
Код:
arp -s 192.168.180.10 22-33-44-55-66-AA 192.168.108.4
arp -s 192.168.180.11 22_33_44_55_66_AB 192.168.108.4
arp -s 192.168.180.12 22_33_44_55_66_AC 192.168.108.4
arp -s 192.168.180.13 22_33_44_55_66_AD 192.168.108.4
arp -s 192.168.180.14 22_33_44_55_66_AE 192.168.108.4
arp -s 192.168.180.15 22_33_44_55_66_AF 192.168.108.4
arp -s 192.168.180.16 22_33_44_55_66_10 192.168.108.4
arp -s 192.168.180.17 22_33_44_55_66_11 192.168.108.4

собственно первый ip - это возможные ip ПЛИС с прописанными мак адресами. Второй ip - ip принимающего компьютера.

PS И пакеты начинали приниматься приложением.  :)

PPS да, собственно я разбирался в том инциденте, так сказать. Запрашивается mac адрес карточки для привязки к ip, но ПЛИС может только слушать и отправлять датаграммы, более полную реализацию сетевого протокола в неё не запихали :)


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: CuteBunny от Февраль 03, 2015, 16:14
Ну для начала шарк включает неразборчивый режим сетевушки и слушает все пакетики.

        
Код:
socket8202_ = new QUdpSocket;
connect( socket8202_, SIGNAL( connected()), SLOT(connected()));
connect( socket8202_, SIGNAL( disconnected()), SLOT(disconnected()));
connect( socket8202_, SIGNAL( error(QAbstractSocket::SocketError)), SLOT(error(QAbstractSocket::SocketError)));
connect( socket8202_, SIGNAL( readyRead()), SLOT(readyRead()));
socket8202_->bind(8202);

Вот такой вот код спокойно принимал данные с ПЛИС.

Компьютер посылал ПЛИС дополнительный udp запрос - насколько я помню что то типа запроса имени, на что плис отвечала молчанием и udp пакет отбрасывался. Оо вспомнил. Запрашивался мак адрес карточки. Но плисина на это не рассчитывалась.

Собственно было и решение проблемы - вот такой вот bat файл
Код:
arp -s 192.168.180.10 22-33-44-55-66-AA 192.168.108.4
arp -s 192.168.180.11 22_33_44_55_66_AB 192.168.108.4
arp -s 192.168.180.12 22_33_44_55_66_AC 192.168.108.4
arp -s 192.168.180.13 22_33_44_55_66_AD 192.168.108.4
arp -s 192.168.180.14 22_33_44_55_66_AE 192.168.108.4
arp -s 192.168.180.15 22_33_44_55_66_AF 192.168.108.4
arp -s 192.168.180.16 22_33_44_55_66_10 192.168.108.4
arp -s 192.168.180.17 22_33_44_55_66_11 192.168.108.4

собственно первый ip - это возможные ip ПЛИС с прописанными мак адресами. Второй ip - ip принимающего компьютера.

PS И пакеты начинали приниматься приложением.  :)

PPS да, собственно я разбирался в том инциденте, так сказать. Запрашивается mac адрес карточки для привязки к ip, но ПЛИС может только слушать и отправлять датаграммы, более полную реализацию сетевого протокола в неё не запихали :)

Не совсем понимаю при чем здесь протокол arp?


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: CuteBunny от Февраль 03, 2015, 16:15
WireShark не слушает пакеты на localhost: http://wiki.wireshark.org/CaptureSetup/Loopback

localhost ~ 127.0.0.1, но это не сетевой интерфейс какбэ.

Читаем ниже по той же ссылке:


Supported Platforms

See CaptureSetup/NetworkMedia for Wireshark capturing support on various platforms. Summary: you can capture on the loopback interface on Linux, on various BSDs including Mac OS X, and on Digital/Tru64 UNIX, and you might be able to do it on Irix and AIX, but you definitely cannot do so on Solaris, HP-UX, or Windows.


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: Bepec от Февраль 03, 2015, 17:20
Поясню для kvv.
Ситуёвина:
ПЛИС посылает UDP пакет с данными и имеет ip 192.168.1.6.
Компьютер получая пакет от неизвестного узла пытается узнать его MAC адрес при помощи протокола arp.
На arp запрос ПЛИС не реагирует - оно умеет только udp слать и принимать.
Результат:
Пакеты от компьютера не доходят до ПЛИС - потому что нет мак адреса в таблице и компьютер вообще не в курсе куда слать данные.
Пакеты от ПЛИС отбрасываются компьютером, причину я не знаю, но в сокет данные не попадают. Их можно получить только добавив в arp запись об ПЛИС или же включением захвата на сетевой карте.

PS данная схема происходит на Windows xp/7. Собственно проблема аналогична описанной в первом сообщении. Т.к. сетевые протоколы не привязаны к ОС, я предполагаю что сценарий одинаков для большинства операционных систем и мой совет может решить проблему.

PPS Если же я неправ (что будет странно, ведь способ 100% решает подобную проблему), я буду рад выслушать ваши соображения и поправки к моим репликам :)


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: CuteBunny от Февраль 03, 2015, 18:15
Поясню для kvv.
Ситуёвина:
ПЛИС посылает UDP пакет с данными и имеет ip 192.168.1.6.
Компьютер получая пакет от неизвестного узла пытается узнать его MAC адрес при помощи протокола arp.
На arp запрос ПЛИС не реагирует - оно умеет только udp слать и принимать.
Результат:
Пакеты от компьютера не доходят до ПЛИС - потому что нет мак адреса в таблице и компьютер вообще не в курсе куда слать данные.
Пакеты от ПЛИС отбрасываются компьютером, причину я не знаю, но в сокет данные не попадают. Их можно получить только добавив в arp запись об ПЛИС или же включением захвата на сетевой карте.

PS данная схема происходит на Windows xp/7. Собственно проблема аналогична описанной в первом сообщении. Т.к. сетевые протоколы не привязаны к ОС, я предполагаю что сценарий одинаков для большинства операционных систем и мой совет может решить проблему.

PPS Если же я неправ (что будет странно, ведь способ 100% решает подобную проблему), я буду рад выслушать ваши соображения и поправки к моим репликам :)

Ок, спасибо.


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: billidean от Ноябрь 27, 2015, 15:32
И вообще, в данном проекте для ПЛИС должна быть реализована реакция на ARP и ECHO, это как минимум, иначе могут возникать подобные проблемы.
Как уже было сказано, комп (например Винда), по истечении некоторого неопределенного времени будет запрашивать МАК-адрес девайса (ПЛИСки) для обновления своей таблицы соединений, и ОЕНЬ захочет что-то получить в ответ. А если не получит, то все пакеты от этого девайса будут отсеиваться самой ОС (Виндой). И т.п....

З.Ы.: даже если я и опоздал с ответом, это может помочь последующим читателям :)


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: Racheengel от Ноябрь 27, 2015, 23:25
А на других ос так же не работает?


Название: Re: Помогите ПЛЗ. Прием UDP
Отправлено: Bepec от Ноябрь 28, 2015, 07:45
Ну, в моём случае на линуксе тоже не работало, всё так же из-за отсутствия привязки к маку.

to billidean: по хорошему в плисине много чего должно быть, но плисина ограничена задачей. Или так, или не лезет.