|
|
|
подключённые и неподключённые UDP-сокеты
|
|||
|---|---|---|---|
|
#18+
Уважаемые форумчане, у меня следующий вопрос. Сразу скажу, что проблемы в общем то нет, она решена, но прошу мне помочь в понимании задачи. Программа написана под Дебиан. В некоторой части кода создаётся UDP-сокет, затем он биндиться к локальному порту. Тут никаких подвохов нет. В некоторый момент через этот сокет пытаемся передавать данные. Вот тут есть два варианта: 1) сделать сокет подключённым. То есть к нему применить вызов connect(). Тем самым указать "куда и на какой порт" мы будем слать данные, и в дальнейшем использовать функцию send(). В этом случае он будет принимать данные только от указанного хоста. 2) оставить его неподключённым. Для передачи данных использовать функцию sendto(). В этом случае сокет будет принимать данные от любой машины (так как адрес удалённой машины не указан). По тех. заданию фактически данные нужно принимать ТОЛЬКО С ОДНОГО ip-адреса, причём этот адрес заранее известен. Логично использовать 1-ый вариант и отдать фильтрацию сообщений на откуп ядру. НО! Есть глюк. Программа молча вылетает, если мы пытаемся послать пакет, при этом есть связь с удалённым хостом, удалённый хост пингуется, но на нём не запущена программа, принимающая данные. Иными словами - удалённый хост есть, а принимающий порт на нём никто не слушает. Вылетает молча, никаких ошибок не выдаёт, никаких нарушений сегментации. ВАЖНО: если выткнуть сетевой кабель из машины (то есть физически нарушить канал связи), то программа не вылетает. Если использовать второй вариант с неподключённым сокетом, то всё работает как по маслу, независимо от того подключён ли кабель, слушают ли на удалённом хосте порт, превышено ли давление в унитазе. Но в этом случае приходится вручную проверять адрес машины во входящих данных. Итог: почему с подключённым сокетом UDP такой глюк с передачей данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2011, 11:55 |
|
||
|
подключённые и неподключённые UDP-сокеты
|
|||
|---|---|---|---|
|
#18+
good_game, Отличие ситуации с не запущенной удалённой программой от ситуации с выдернутым кабелем в том, что в первом случае в ответ на сообщение приходит ICMP-ответ Port Unreachable, во втором то, будет ли получена какая-либо ошибка, зависит от конкретной сетевой конфигурации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2011, 14:32 |
|
||
|
подключённые и неподключённые UDP-сокеты
|
|||
|---|---|---|---|
|
#18+
tempestadept, то есть программа выходит "законно"? И причину нужно искать в настройках операционной системы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2011, 14:42 |
|
||
|
подключённые и неподключённые UDP-сокеты
|
|||
|---|---|---|---|
|
#18+
В любом случае спасибо за мысль. Теперь хоть понятно в какую строну копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2011, 14:50 |
|
||
|
подключённые и неподключённые UDP-сокеты
|
|||
|---|---|---|---|
|
#18+
good_game, Для ОС вполне логично считать сокет нерабочим, если получено Port Unreachable. Программа получает исключение (если написана на чём-то б-м высокоуровневом), тонкость в том, что не при вызове connect(), а при использовании сокета. Соответственно, программа должна уметь его обрабатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2011, 14:53 |
|
||
|
|

start [/forum/topic.php?fid=25&msg=37170119&tid=1484320]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
140ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 459ms |

| 0 / 0 |
