2017-02-08 10 views
0

Работа над проектом в Visual Studio 2015 с настраиваемым количеством TCP-соединений для разных клиентов. Заметив странное поведение при работе с типичными аппаратными настройками с закрытыми сетями.C++ - Программа проявляет странное поведение при попытке подключения на TCP-клиентах к адресам, которые не существуют

Предполагая, что каждое из TCP-соединений указывает на действительный другой адрес, программа отлично функционирует, отправляет и принимает сообщения по мере необходимости всем различным клиентам. Однако, если я отключу одну из машин, сервер начнет разворачивать. Самым очевидным признаком (хотя и не единственным, что вызвано этим) является один из наших UDP-сокетов, который должен получать сообщения с 10hz, начинает получать примерно на 1hz. Это будет продолжаться до тех пор, пока вы не подключите отсутствующий компьютер к сети. Как ни странно, на данный момент упомянутый выше контрольный разъем UDP быстро получит и обработает все сообщения, которые он должен был получать во время простоя. После этого программа будет нормально функционировать снова.

Я нахожусь дома, думая об этом, поэтому у меня нет исходного кода для публикации (и, возможно, он будет нахмуриться для этого, так или иначе), но я не знаком с причинами, из-за которых может возникнуть недействительное TCP-соединение такое поведение. Кто-нибудь испытывает что-то подобное и имеет что-то, что сработало для них в этой ситуации?

+0

Добро пожаловать в переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+0

Есть ли часть кода на C++, где вы думаете, что проблема возникает? Если нет, это скорее сетевой вопрос и не относится к StackOverflow. Это также очень широкий вопрос, а это означает, что получение полезного ответа очень сложно. – NonCreature0714

+1

Подключиться() к несуществующему адресу может занять до 60 секунд. –

ответ

1

Тот факт, что сообщения UDP не отправляются с обычной скоростью при попытке подключения к TCP-сокету, предполагает, что вы используете один и тот же поток для обоих действий.

Помимо этого, я обещаю, что сообщения «AWOL» UDP не отправлены. Сообщения UDP не задерживаются в сети, ожидающей доставки.

Если поток, выдающий запрос подключения TCP, является тем же самым потоком, который нажимает сообщения UDP, тогда вы нашли свою проблему. Необходимо учитывать тот факт, что запрос блокировки TCP-соединения может блокировать поток в течение длительного времени. Решения включают использование неблокирующего запроса на соединение или запуск отдельных потоков для TCP и UDP. Какой подход работает лучше всего зависит от вашего дизайна.

[Рассмотрите возможность использования ASIO, он обеспечивает хороший инструмент для обработки неблокирующих вводов-выводов. но это, вероятно, требует значительного пересмотра вашей заявки.]

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