Тестирование сетевых приложений C # - PullRequest
1 голос
/ 23 октября 2010

Я работаю над программой, в которой несколько пользователей будут связаны друг с другом через p2p. Я хотел бы протестировать запуск моей программы, открыв несколько экземпляров на одном компьютере и заставить эти экземпляры взаимодействовать, как если бы они находились на разных компьютерах (т.е. как будто это реальная вещь). Есть идеи, как к этому подойти?

Спасибо,

PM

Ответы [ 2 ]

1 голос
/ 23 октября 2010

Одной из основных проблем при этом является то, что API-интерфейс Windows Sockets, который .NET использует внутренне, позволяет одному приложению связываться с данной конечной точкой (IP-адресом и портом) одновременно.

В порядкеДля поддержки нескольких экземпляров приложения на одном компьютере необходимо преодолеть это ограничение.Существует несколько возможных способов сделать это, включая

  1. Запуск нескольких виртуальных машин, чтобы один экземпляр на каждом компьютере мог связываться с конечной точкой так же, как это могли делать несколько реальных клиентских машин.Это хорошая стратегия, однако она может стать довольно дорогой в отношении ресурсов, необходимых для запуска нескольких гостевых ОС и хоста.
  2. Добавить поддержку приложения для запуска нескольких экземпляров на одном компьютере.Как правило, это включает использование механизма межпроцессного взаимодействия для доставки данных в экземпляр, который привязан к конечной точке.
  3. Каждый экземпляр должен использовать отдельную конечную точку и использовать широковещательную или многоадресную передачу UDP или некоторые другие средства IPC для информирования каждого из них.экземпляр, где другие связаны так, что все они могут «видеть» друг друга.

Diagram of IPC communication between two instances

На приведенной выше схеме экземпляр A был запущен первым и содержит сокет, который являетсяпрослушивание EndPoint.Когда запускается экземпляр B, он проверяет другой экземпляр [1 *] и, обнаружив, что это не единственный экземпляр, устанавливает соединение IPC с экземпляром A [2 *]

При отправке сообщения экземпляр B будетзаписать сообщение в канал IPC между собой и экземпляром A. Экземпляр B будет включать в сообщение уникальный идентификатор, экземпляр A использует этот идентификатор, чтобы сообщать, из какого экземпляра произошло сообщение, и направлять сообщения, содержащие идентификатор для экземпляра B, обратно.к экземпляру.

[1 *] Один из способов проверить наличие второго экземпляра - использовать именованный мьютекс.При запуске приложение должно попытаться получить Mutex, если оно выполнено успешно, то это единственный экземпляр и должно быть привязано к конечной точке прослушивания, если получение Mutex завершилось неудачно, тогда выполняется другой экземпляр приложения, а второй экземпляр должен попытатьсяполучить канал IPC с экземпляром, связанным с конечной точкой прослушивания.

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

Это ни в коем случае не полный ответ, но я надеюсь, что это помогло

0 голосов
/ 23 октября 2010

Попробуйте виртуализацию. То есть, используя VMWare или VirtualBox (например), вы можете запускать различные «Машины» в вашей единой системе. Просто создайте три или четыре виртуальные машины и вуаля ... у вас есть возможность запускать различные экземпляры, как если бы они были настоящими.

Убедитесь, что вы устанавливаете их с использованием сетевых подключений NAT, предоставляя каждой из ваших машин свой собственный «внутренний» IP-адрес, с которым вы затем можете общаться с вашей программой.

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