Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не стабильная работа UDP. 
:(
    Опции темы
DrHex
Дата 21.10.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



При программирование UDP на сервере должен быть всегда рецейв. Попробуйте не блокирующие сокет, с таким что бы на получения данных осадить N количество буферов и при уменьшение постоянно их увеличивать. По идее должно полечить. Похоже на то что когда происходит отправка пакета, приемник еще или уже не готов к получению и соответственно пакеты провалюваются. 
--------------------
google.com и это все.
PM MAIL   Вверх
OlegIT
Дата 21.10.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 684
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Цитата

А вообще выложили бы весь код - приаттачили.......

Весь код достаточно сложно выложить, проект большой. И я сейчас многое закрыл, работаю только на приём данных и их отображение. Выкладываю то, что реально сейчас работает.

Цитата
 
Цитата
 
Увы, но именно так. Это тогда, когда приёма нет.

Этого я не понял......

Вы спрашивали «Далее - не приходит вообще НИ ОДИН пакет? В принципе?» Да, ни одного пакета не приходит.

Цитата

Прокомментируйте мне ваши проверки - и покажите

Можно подумать и эту серию ифов прокомментировать, но программа, когда не работает до них не доходит.
Я думаю так, могу ошибаться. Если адрес не пустой (INADDR_ANY равен 0x00000000) и данные пришли от туда, откуда ожидали, то идём дальше, иначе return ERR_FIFO_EMPTY;

Цитата

как вы заполняете структуры адресов сокетов - программы(получателя данных) и прибора

Адреса беру из объекта SysIPAddress32 в текстовом виде в формате «xxx.xxx.xxx.xxx»

Цитата

С прибора вы ведь получаете данные - и ему тоже что-то отправляете?

В прибор посылаются команды и он(прибор) отвечает на них. Проверил по снифферу, отсылка команд из программы и приём ответа из прибора идёт всегда, не зависимо от того доходят или нет эти данные-ответы до программы.

DrHex

Цитата

Похоже на то что когда происходит отправка пакета, приемник еще или уже не готов к получению и соответственно пакеты провалюваются.

У меня тоже такое подозрение.
Но я не всё в Вашем ответе понял, наверно не всё знаю.
Что такое «не блокирующие сокет» и как его создать?
«осадить N количество буферов и при уменьшение постоянно их увеличивать» как это сделать? Можно немного подробнее.



Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  arh.rar 4,55 Kb
PM MAIL   Вверх
Олег2005
Дата 22.10.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



У прибора есть IP-адрес? Какой? Порт - какой?
Обмен данными начинает всегда программа?
На компе с программой - одна сетевая карта?
Какой IP-адрес?
У адресов - одна маска? Прибор далеко? В Африке - или в той же локалке? 
Программа посылает команду на прибор - прибор получает, понимает ее и что-то шлет в программу.
Так?

И в самом начале вы пишите - что иногда все идет нормально - а иногда вообще куда-то данные исчезают.?
При каких условиях - не пытались выяснить? - работает хорошо - работает плохо (т.е. вообще не работает) 


Какой смысл этого массива в программе: udp[Desc]?

Насчет неблокироющих сокетов - не заморачивайтесь, здесь им не место, блокирующие(ваши) в самый раз.
PM MAIL WWW MSN   Вверх
OlegIT
Дата 22.10.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 684
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Цитата

У прибора есть IP-адрес? Какой? Порт - какой?
Обмен данными начинает всегда программа?
На компе с программой - одна сетевая карта?
Какой IP-адрес?
У адресов - одна маска? Прибор далеко? В Африке - или в той же локалке? 

В компе две сетевых карты, одна «смотрит» во вне, вторая только на прибор, специально так сделал, что бы ни чего не мешало.
Комп стоит слева от меня, прибор справа.
У компа, этой сетевой карты, адрес 192.224.4.35, маска 255.255.255.0 (ставил и 255.255.0.0), у прибора 192.224.4.33, маски нет.

Цитата

Программа посылает команду на прибор - прибор получает, понимает ее и что-то шлет в программу.
Так?

Да так. Причём не зависимо от того, «видит» программа эти ответы/данные или нет (проверенно по байтно в сниффере).

Цитата

И в самом начале вы пишите - что иногда все идет нормально - а иногда вообще куда-то данные исчезают.?
При каких условиях - не пытались выяснить? - работает хорошо - работает плохо (т.е. вообще не работает) 

Условия выяснить пытался, но пока безрезультатно. 
Как я говорил, в программе есть кнопка, по которой, потоки останавливаются, все связи, сокеты закрываются, а затем всё инициализируется заново, функция OnBnClickedConnect() исходника. Если нажимать эту кнопку, то не предсказуемо, через одно… пять… нажатий состояние приёма может поменяться на противоположноё. Здесь состояние это приходят или не приходят данные.

Цитата

Какой смысл этого массива в программе: udp[Desc]?

Хранилище нескольких сокетов, связей. У меня сейчас два элемента этого массива используется, один для приёма данных из прибора, другой для отсылки команд в прибор.

PM MAIL   Вверх
Олег2005
Дата 22.10.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Итак, все по новой......
В программе используются два сокета - один на прием, второй на передачу.
Зачем?
Если смотреть проще - то один и тот же сокет может применяться и для передачи, и для приема.
Потому как в UDP-модуле стека у сокета два буфера - передающий - он формируется как стек - и приемный - обычный буфер.
То, что вы сокеты биндите на конкретную карту, которая смотрит на прибор - это безусловно верно.
Вы оба сокета биндите на этот один сокетный адрес, так? Для этого используете reuseaddr
И теперь - главное.
Стивенс пишет, что когда производится дублирование адреса для двух сокетов - какой сокет получит ответную датаграмму - зависит от реализации стека.
Потому у меня подозрение, что вы читаете на на одном сокете - а передатчик может направить пакет на другой. как раз тот, который вы используете для приема.
Потому идея двух сокетов сбинденных на один сокетный адрес для меня в данном случае непонятна.
Почему не передавать - и принимать - все по одному и тому же сокету....
Тогда никаких проблем вообще не будет...
Попробуйте поэкспериментировать - и ставить recvfrom() - для обеих сокетов......может все и получите.....

Это сообщение отредактировал(а) Олег2005 - 22.10.2009, 23:48
PM MAIL WWW MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.