Как проверить время ожидания подключения в приложении RHEL c / cpp - PullRequest
1 голос
/ 02 сентября 2011

У меня есть приложение, которое общается с сервером через HTTP. Я написал код для контроля времени ожидания соединения (время ожидания ответа сервера). Но мне трудно создать контрольный пример для проверки моего кода тайм-аута подключения. Не могли бы вы помочь мне.

В основном, рукопожатие TCp будет содержать Узел A отправляет пакет TCP SYNchronize на узел B

Хост B получает SYN

Хост B отправляет подтверждение SYNchronize

Хост A получает B SYN-ACK

Хост A отправляет ACKnowledge

Хост B получает ACK. УСТАНОВЛЕНО сокет TCP.

В моем приложении, если сервер не завершает TCP-хэндшек за x секунд, приложения переходят на следующий сервер. Но чтобы проверить этот код, мне нужна заглушка сервера, которая, вероятно, примет пакет SYN от клиента, но не установит пакет SYN + ACK для клиента. Таким образом, заставляя клиента ждать ответа сервера.

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

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Учитывая, что вы упомянули RHEL, я думаю, вам лучше использовать iptables, чтобы помочь проверить это. Например, вы можете позвонить:

iptables -I INPUT -s hostb -d hosta -p tcp --dport $port --tcp-flags SYN,ACK SYN,ACK -j DROP

вызов этого перед запуском теста (или даже, может быть, во время него?) И эквивалентного совпадения -X для удаления, кажется, безусловно, самый простой способ разорвать рукопожатие на полпути.

Отбросить все SYN + ACK (предупреждение, БУДЕТ разрывать новые соединения SSH):

iptables -I INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -j DROP

Отбросить все от или до 10.10.22.34:

iptables -I INPUT -s 10.10.22.34 -j DROP
iptables -I OUTPUT -d 10.10.22.34 -j DROP

Лично я бы использовал наиболее конкретное совпадение, которое вы можете написать, чтобы избежать случайного нарушения удаленного доступа или чего-либо еще в то же время.

Вы можете стать более любопытным и использовать совпадение -m owner, чтобы применять это правило только к пакетам в / из UID, под которым вы запускаете этот тест.

1 голос
/ 02 сентября 2011

Я бы не стал полагаться на iptables или любой другой инструмент для модульного тестирования, так как эти тесты были бы слишком хрупкими.Что если IP-адрес изменится или юнит-тесты будут запущены на другом компьютере?Что если код должен быть перенесен в ОС, где iptables недоступен?

Чтобы изолировать модульные тесты от сети , я бы инкапсулировал API сокетов в классе Socket.Тогда у меня будет класс Connection, который использует класс Socket.Я бы провел модульное тестирование класса Connection с классом TimeoutSocket (производным от Socket), который имитирует сервер, не принимающий первый запрос на подключение.

Ваш код не должен зависеть от того, что происходит впровод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...