2014-04-23 1 views
0

Я хотел бы построить завершенную сеть (каждый узел подключается к остальным узлам). У меня есть группа сверстников, скажем, она включает P2P1, P2P2, P2P3. Предполагая, что все одноранговые узлы работают на одной машине (localhost). Каждый одноранговый узел имеет клиентскую и серверную стороны, которые написаны в одном файле.Как отличить узлы, запущенные на одном компьютере в сети p2p, сокет на языке C

Первый P2P1 инициализируется как «p2p Name_of_group Port_Number_for_Server_Side». Затем P2P2 как «p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P1». А затем P2P3 как «p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P2».

Клиентская сторона P2P2 подключается к серверной стороне P2P1, клиентская сторона P2P3 подключается к серверной стороне P2P2.

Теперь P2P1 подключается к P2P3 (автоматически в коде, а не от пользователя). Если есть новый одноранговый узел, скажем, P2P4, также хотел бы подключиться к P2P1 (от пользователя). Как я могу отличить P2P3 от старого партнера и P2P4 как новый одноранговый узел, поскольку оба из них в первый раз только соединяют() с P2P1 (еще не send()) ?.

Кроме того, я считал, что использовать «hostname: port», чтобы отличать их, но поскольку они работают на одном компьютере (имя хоста аналогично), а порт - порт клиента (не серверный порт, который уникален для каждого однорангового узла, у каждого однорангового узла много клиентских портов). Когда P2P2 подключается к P2P1, P2P1 информируется, что P2P2 присоединяется к группе (включая P2P1 и P2P2). Когда P2P3 подключается к P2P2, P2P2 информируется, что P2P3 присоединился к группе. Однако имя P2P2 на P2P1 отличается от имени P2P2 на P2P3, поскольку клиентский порт P2P2, подключающийся к P2P1, отличается от него P2P2, подключающимся к P2P3. Я хочу уникальное имя для P2P2, как я могу это сделать? Большое спасибо за ваш комментарий.

+0

Почему вы не используете порт сервера? Он уникален и постоянен в сеансе за одноранговое соединение, что звучит так, как вы описываете. Кроме того, существует несколько [схем UUID] (https://en.wikipedia.org/wiki/Universally_Unique_Identifier). –

+0

Привет, Джон, проблема в том, что я не смог получить порт сервера с помощью getpeername() или getinfoname(), поскольку, например, клиентская сторона P2P2 подключается к серверной стороне P2P1, поэтому на P2P1 я могу только получить клиентский порт P2P2. В getpeername() sin_port возвращает порт клиентской стороны P2P2, с которым соединяется P2P1. – zuhakasa

+0

А, это имеет смысл. Правильно, в клиентском соединении нет ничего, что идентифицировало бы что-нибудь еще о клиенте, поэтому вам нужно будет создать его в протоколе вашего приложения. Вероятно, это хорошо, потому что вы можете отправлять каждому партнеру все, что он может использовать. –

ответ

0

Честно говоря, вы потеряли меня в своей схеме именования.

Позвольте мне перефразировать вопрос.

A server accepts two connections. Is there a way to tell that both 
connections are initiated by the same agent? 

Если это вопрос, на который вы хотите получить ответ, ответ будет отрицательным. Единственной информацией, которую сервер имеет в тот момент, является то, что возвращается getpeername, что в вашей схеме вещей не идентифицирует соединительный агент.

Вы можете рассмотреть возможность назначения каждому агенту отдельного диапазона клиентских портов. Или добавление фазы рукопожатия в ваш протокол.

+0

Я имею в виду, если я останусь на уровне сверстников, я хотел бы получить уникальные имена других сверстников, чтобы, если я останусь на другом уровне, я все еще вижу уникальные имена сверстников в группе. Например, когда P2P2 подключается к P2P1, клиентская сторона P2P1 будет подключаться и взаимодействовать с клиентской стороной P2P2. В P2P1, если я использую getpeername(), я могу получить клиентский порт P2P2. Однако P2P2 имеет множество клиентских портов, поскольку он подключается ко многим одноранговым узлам, поэтому, когда в P2P1, если я перечислю текущие одноранговые узлы в группе, имя других одноранговых узлов будет отличаться от них, если я перечислил их на P2P2. – zuhakasa