2015-10-07 5 views
-1

У меня возникли проблемы с пониманием вилки при использовании сокетов. Я понимаю, что fork - это то, что вы можете обрабатывать несколько клиентов одновременно, но тогда я не уверен, что он должен использоваться в следующем сценарии:Вилка при программировании сокетов

Я создаю макет сервера P2P. У меня должен быть трекер и сверстник. Трекер обрабатывает соединения со всех сверстников. Когда одноранговый узел сначала подключается к трекеру, он отправляет список своих файлов трекеру, а затем трекер сохраняет все файлы в коллекции (включая IP-адреса) (коллекция имеет файлы со всех сверстников). Кроме того, если сверстник завершает работу, то трекер удаляет файлы этого сверстника из коллекции (те, которые содержат его IP-адрес). Трекер отправит любой peer весь список файлов, если он получит команду «получить файлы».

Здесь я не понимаю, как я могу использовать fork (или если это даже необходимо), потому что если я буду использовать fork, то, когда клиент выйдет, я удалю его файлы из списка, но так как его в своем собственном процессе , как будет изменен список вне дочернего процесса?

+0

Похоже, вы пытаетесь выполнить задачу, которая слишком продвинута для вашего набора навыков. Но если вы это сделаете, я настоятельно рекомендую начать с архитектуры цикла poll, используя один процесс. –

ответ

1

Либо использовать один процесс (используя либо потоки, либо цикл вокруг функции обнаружения, например select или poll), либо использовать какой-либо способ синхронизации информации между процессами, такими как файл, база данных или разделяемая память.

+0

было бы возможно использовать общую память, если я не знаю размер списка файлов (это могут быть миллионы файлов)? Я думал об использовании структуры связанных списков, но могу ли я поделиться этим просто разделяя память, содержащую голову и хвост списка? – coder4lyf

+0

@Rachelle Общая память - это самое сложное решение. Я бы не пытался, пока вы не знакомы с более простыми решениями. Пока я предлагаю либо использовать библиотеку базы данных, либо придерживаться одного процесса, используя цикл 'poll'. –

+0

В общей памяти нет ничего особо сложного по сравнению со сложностью всего решения. Но я согласен с Дэвидом в главном - начинайте медленно. Сначала создайте однопоточную версию с опросом. – SergeyA

Смежные вопросы