Краткий ответ: либо удаленный сервер прекратил отправлять дейтаграммы UDP, либо сеть по какой-то причине перестала их доставлять.
Я предполагаю, что у вас есть какой-то способ сообщить серверу случайный порти IP, который вы используете для прослушивания дейтаграмм.Если сервер не использует тот же порт и IP для отправки, UDP-датаграммы будут молча исчезать.(Но вы говорите, что ваш клиентский код работает некоторое время, а затем останавливается. Это означает, что IP и порт верны.)
Я также предполагаю, что вы бы сообщили нам, если выполучаю исключения и вижу следы стека (!)
Кроме вышесказанного, я не вижу ничего плохого в вашем коде.Если я что-то не пропустил, значит, проблема в другом.Единственные другие объяснения, которые я могу придумать:
Сервер прекратил отправку.
- Возможно, он разбился.
- Возможно, он "случайно" переключился на другой порт.
- Возможно, он заблокирован, потому что ожидает чего-то, что не произойдет.Например, прибытие ответного сообщения, которое было потеряно.
Сеть прекратила передачу пакетов UDP.Трудно понять, почему:
- Это может быть связано с какой-то защитой от DOS, реализованной в некотором брандмауэре.
- Если ваш клиент находится за шлюзом NAT, и вы используете «дырокол» для пропуска UDP-пакетов, возможно, «дыра» истекла.(Но вы говорите, что это в локальной сети, что подразумевает, что NAT не должен быть задействован. NAT для используемой трансляции IP-адресов на логической границе между двумя сетями; например, частная сеть <-> общедоступный Интернет.)
Как предложено, попробуйте использовать Wireshark с обоих концов, чтобы увидеть, отправляются ли серверные пакеты UDP и продолжают ли они поступать на клиент.Это поможет вам сузить проблему.
Обратите внимание, что если вы пытаетесь реализовать двухстороннюю или многоканальную связь по UDP, вам нужно разрешить случайное удаление сообщений.Протоколы уровня приложения (реализованные с использованием транспорта UDP) должны иметь возможность обнаруживать 1 и восстанавливаться после этого во всех сценариях, в которых сообщение может быть отброшено.Если вы поймете это неправильно, одна из возможностей будет состоять в том, что протокол «блокируется».
1 - Это обычно включает реализацию тайм-аутов на некотором уровне.Однако просто установка времени ожидания на receive
(как предполагает другой ответ) не не решает проблему.