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