TCP-сокет чтения зависает при разрыве соединения Wi-Fi - PullRequest
0 голосов
/ 13 июля 2011

Я сталкиваюсь со специфической проблемой чтения на сокетах TCP, когда соединение Wi-Fi отключается, а затем снова подключается. Сценарий

: я постоянно пингуюсь к серверу на устройстве Windows Pocket PC через Wi-Fi.когда устройство находится в зоне слабого сигнала Wi-Fi, сокет считывает блокировку на неопределенный срок и полностью замораживает устройство, а когда уровень сигнала Wi-Fi становится сильнее, считывание возвращается и все предыдущие операции на экране выполняются.

может кто-нибудь датьрешение этой проблемы

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Раньше я сталкивался с подобными проблемами несколько лет назад, но я изменил свою реализацию, чтобы использовать асинхронные сокеты на сервере и на телефоне.Убедитесь, что вы перехватываете исключения и отслеживаете, сколько байтов было прочитано / отправлено, и вы можете снова выбрать резервное копирование после уведомления другой конечной точки о «восстановленном» соединении (чтобы другая сторона не пыталась полностью начать сначало agian .... логику нужно добавить).

0 голосов
/ 13 июля 2011

Это особенность TCP - TCP надежен, поэтому, если есть какие-либо проблемы с сетью (такие как потеря сигнала Wi-Fi, как вы описываете), данные будут буферизироваться и удерживаться, пока проблема не исчезнет, ​​и в этот моментданные будут отправлены снова, и соединение возобновится.

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

Также кажется, что у вас есть проблема в коде, когда приостановленное соединение полностью блокирует устройство - это, вероятно, вызвано удержанием некоторой блокировки, которую вы не должны делать при попытке прочитать данные из соединения.Обязательно снимите ВСЕ блокировки перед выполнением чтения (или записи) сокета.Если вам удастся решить эту проблему, вы можете обнаружить, что вас не волнует тайм-аут TCP.

...