powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / подключённые и неподключённые UDP-сокеты
6 сообщений из 6, страница 1 из 1
подключённые и неподключённые UDP-сокеты
    #37169621
good_game
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане, у меня следующий вопрос.
Сразу скажу, что проблемы в общем то нет, она решена, но прошу мне помочь в понимании задачи.
Программа написана под Дебиан. В некоторой части кода создаётся UDP-сокет, затем он биндиться к локальному порту. Тут никаких подвохов нет.
В некоторый момент через этот сокет пытаемся передавать данные. Вот тут есть два варианта:

1) сделать сокет подключённым. То есть к нему применить вызов connect(). Тем самым указать "куда и на какой порт" мы будем слать данные, и в дальнейшем использовать функцию send(). В этом случае он будет принимать данные только от указанного хоста.

2) оставить его неподключённым. Для передачи данных использовать функцию sendto(). В этом случае сокет будет принимать данные от любой машины (так как адрес удалённой машины не указан).

По тех. заданию фактически данные нужно принимать ТОЛЬКО С ОДНОГО ip-адреса, причём этот адрес заранее известен. Логично использовать 1-ый вариант и отдать фильтрацию сообщений на откуп ядру.
НО! Есть глюк. Программа молча вылетает, если мы пытаемся послать пакет, при этом есть связь с удалённым хостом, удалённый хост пингуется, но на нём не запущена программа, принимающая данные. Иными словами - удалённый хост есть, а принимающий порт на нём никто не слушает. Вылетает молча, никаких ошибок не выдаёт, никаких нарушений сегментации. ВАЖНО: если выткнуть сетевой кабель из машины (то есть физически нарушить канал связи), то программа не вылетает.

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

Итог: почему с подключённым сокетом UDP такой глюк с передачей данных?
...
Рейтинг: 0 / 0
подключённые и неподключённые UDP-сокеты
    #37170119
tempestadept
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
good_game,

Отличие ситуации с не запущенной удалённой программой от ситуации с выдернутым кабелем в том, что в первом случае в ответ на сообщение приходит ICMP-ответ Port Unreachable, во втором то, будет ли получена какая-либо ошибка, зависит от конкретной сетевой конфигурации.
...
Рейтинг: 0 / 0
подключённые и неподключённые UDP-сокеты
    #37170153
good_game
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tempestadept,

то есть программа выходит "законно"? И причину нужно искать в настройках операционной системы?
...
Рейтинг: 0 / 0
подключённые и неподключённые UDP-сокеты
    #37170175
good_game
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В любом случае спасибо за мысль. Теперь хоть понятно в какую строну копать.
...
Рейтинг: 0 / 0
подключённые и неподключённые UDP-сокеты
    #37170189
tempestadept
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
good_game,

Для ОС вполне логично считать сокет нерабочим, если получено Port Unreachable. Программа получает исключение (если написана на чём-то б-м высокоуровневом), тонкость в том, что не при вызове connect(), а при использовании сокета. Соответственно, программа должна уметь его обрабатывать.
...
Рейтинг: 0 / 0
подключённые и неподключённые UDP-сокеты
    #37203247
good_game
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tempestadept,

спасибо за мысль.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / подключённые и неподключённые UDP-сокеты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]