2016-11-08 4 views
0

Я создал тестовую серверную программу в Delphi с помощью TIdTCPServer, который имитирует несколько серверов на одном ПК, добавив несколько портов в привязки по вызову IdTCPServer1.Bindings.Add. Это хорошо работает.Как имитировать ошибку сокета

Но я также хочу смоделировать сетевую ошибку, отключенную для порта, который должен вернуть клиенту ошибку сокета. Я попробовал Bindings.Delete для этого порта, а также попробовал CloseSocket, но безуспешно. Любые идеи о том, как имитировать эту ошибку, отключив или удалив порт?

+0

Я полагаю, вы можете освободить серверный компонент, но это довольно грязный способ сделать это. –

+1

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

+1

Установите правило брандмауэра, чтобы заблокировать диапазон портов или IP-адресов, если вы хотите имитировать потерю сети или потеря связи. – selbie

ответ

0

Я отправил это в качестве комментария, но теперь, когда я думаю об этом, я считаю, что это «лучший подход» ответ (хотя, возможно, не то, что вы надеялись):

ОС будет «защищать» вы, так что симуляция сетевой ошибки на одной машине является близкой к невозможной головной боли.

НО, используя виртуальную машину (виртуальную машину), вы можете легко это сделать - используйте виртуальную машину как «клиент» для подключения к вашему серверному приложению, а затем убить виртуальную машину без предупреждения (отключить виртуальную машину) - происходит ошибка сети.

В качестве альтернативы, реализовать пользовательский протокол TCP/IP для наземного подключения по сырому сокету, обходя уровень ядра ОС ... проще.

+0

Я сделал эту программу специально, чтобы не запускать разные машины/виртуальные машины, чтобы протестировать многопользовательский рабочий поток. Я изучу другие варианты, прежде чем я перейду на виртуальный путь. Благодарю. – user173399

Смежные вопросы