Я хотел бы построить завершенную сеть (каждый узел подключается к остальным узлам). У меня есть группа сверстников, скажем, она включает 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, как я могу это сделать? Большое спасибо за ваш комментарий.
Почему вы не используете порт сервера? Он уникален и постоянен в сеансе за одноранговое соединение, что звучит так, как вы описываете. Кроме того, существует несколько [схем UUID] (https://en.wikipedia.org/wiki/Universally_Unique_Identifier). –
Привет, Джон, проблема в том, что я не смог получить порт сервера с помощью getpeername() или getinfoname(), поскольку, например, клиентская сторона P2P2 подключается к серверной стороне P2P1, поэтому на P2P1 я могу только получить клиентский порт P2P2. В getpeername() sin_port возвращает порт клиентской стороны P2P2, с которым соединяется P2P1. – zuhakasa
А, это имеет смысл. Правильно, в клиентском соединении нет ничего, что идентифицировало бы что-нибудь еще о клиенте, поэтому вам нужно будет создать его в протоколе вашего приложения. Вероятно, это хорошо, потому что вы можете отправлять каждому партнеру все, что он может использовать. –