Есть ли способ убедиться, что соединение с сокетом Indy 9 действительно разорвано (приложение Delphi 6)?

У меня есть приложение Delphi 6, которое обменивается аудиоданными через сокет с внешним аппаратным устройством. Аппаратное устройство имеет внутреннюю проблему, когда иногда его внутренняя буферная обработка замедляется, особенно в течение длительных периодов использования, и неприятные задержки проникают в аудиопотоки. Это серьезная проблема, поскольку аудиоданные часто лежат в основе двустороннего разговора между людьми в реальном времени. Однако разрыв соединения и восстановление его устраняет проблему.

Я знаю, как закрыть / отключить сокет с Indy, это довольно просто. Меня беспокоит то, что какой-то механизм кэширования соединений в Indy или на уровне сокетов Windows может остановить мои попытки отключения, если я попытаюсь подключиться слишком быстро. Есть ли способ убедиться, что сокетное соединение с внешним аппаратным устройством действительно разорвано? Лучше спросить, есть ли способ убедиться, что моя попытка переподключения вынуждает создавать новый новый сокет (дескриптор?), А не повторно использовать старое сокетное соединение?

Внешнее аппаратное устройство "сбрасывается" только в том случае, если создается новое подключение, возможно, потому, что оно очищает свои внутренние очереди и запускается заново (спекуляция с моей стороны, поскольку у меня нет исходного кода для устройства).

1 ответ

Решение

Indy не помешает вам повторно подключиться немедленно. Единственный раз, когда Windows сделает так, это если вы назначаете один и тот же локальный порт для клиента, к которому будет привязываться каждый раз. В этом случае вам придется подождать, пока Windows освободит этот порт для повторного использования. Вы можете вручную установить опцию задержки в сокете, чтобы отключить задержку и немедленное отключение Windows. Или не назначайте локальный порт, и случайный порт будет использоваться при каждом (повторном) подключении.

Другие вопросы по тегам