2014-09-28 1 views
2

Я новичок в программировании сокетов и нуждаюсь в некоторой помощи в создании новой одноранговой сети. Теперь у меня есть сервер A, подключенный к клиентам B и C соответственно одновременно. Я использую API select(), чтобы установить это, и пока это работает (A может взаимодействовать с B и C независимо.) Теперь я хочу, чтобы B и C связывались друг с другом напрямую; скажем, B-запросы на подключение к C без участия A. B и C оба будут все еще подключены к A, но у них будет одноранговое соединение между собой, чтобы иметь возможность разговаривать друг с другом. Любая идея, как это работает? Я попытался сделать мою клиентскую программу как сервер с вызовами listen() и accept(); но он просто замораживает моего клиента.Одноранговая сеть с использованием сокетов C

У меня есть пользовательский интерфейс для выполнения команд на клиенте/сервере, если вам интересно, как я это реализую.

Любая помощь будет глубоко оценена.

+0

Вы также можете 'select()' в своих сокетах прослушивания и не вызывать 'accept()' до тех пор, пока у вас не будет готово соединение для его предотвращения, чтобы избежать его блокировки. –

+0

Фрагменты вашего кода, вероятно, будут полезны. –

+0

Google «равноправные протоколы». –

ответ

0

Для соединений TCP один участник должен быть пассивно прослушивать, а другой должен активно подключаться. (Существует одно исключение: одновременное открытие TCP, что, вероятно, не то, что вы хотите.) В вашем примере, чтобы установить соединение между B и C, вы можете сделать это так же, как в A и B. I.e. вы можете сделать B слушать & принять, и C connect.

Почему ваш клиент зависает? Сообщение об ошибке печати и strace - ваши друзья.

+0

Я не уверен, почему Когда я подключаю A и B, все работает. Но в тот момент, когда я пытаюсь подключить C к B с B, все еще подключенным к A, он зависает. После того, как я поставлю соединение с C, B не принимает соединение и не делает этого выполняйте любые другие операции (например, отображая свой собственный IP через команду, которая ранее работала). Я предполагаю, что B теперь активно слушает другие подключения, а существующие соединения через сокеты спящий режим, но это не мое требование, и я пытался создать Код тоже. Позвольте мне попробовать с strace. Сообщения об ошибках здесь тоже не печатаются :( – Saptarshi