Форкинг с гнездом для прослушивания - PullRequest
3 голосов
/ 03 мая 2010

Я хотел бы убедиться в правильности способа, которым я пытаюсь использовать accept() в сокете.

Я знаю, что в Linux безопасно listen() на сокете, fork() N дочерних и затем recv() пакетов во всех них без какой-либо синхронизации со стороны пользователя (пакеты получают больше или меньше нагрузки сбалансировано между детьми). Но это UDP.

Имеется ли одно и то же свойство для TCP и listen(), fork(), accept()? Могу ли я просто предположить, что можно принимать общий сокет, созданный родителем, даже если другие дети делают то же самое? POSIX, BSD-сокеты или какой-либо другой стандарт определяет это где-то?

1 Ответ

2 голосов
/ 03 мая 2010

Если вы используете fork (), а затем accept () для своих детей, только один дочерний процесс вызовет accept () для соединения и затем обработает его. Это предварительное разветвление, и связи не будут разделены между детьми.

Вы можете использовать стандартную схему «один ребенок» для каждой схемы подключения, изменив порядок, приняв и пометив. Однако оба эти метода предназначены для повышения эффективности, балансировки и т. Д., А не для совместного использования конкретного соединения.

TCP отличается от UDP. Было бы нежелательно делать это в TCP, так как вы почти наверняка получите беспорядок. Данное принятое сообщение может быть распределено по одному или нескольким пакетам, и для нескольких процессов было бы более трудно координировать процесс, чем для того, чтобы один дочерний элемент обрабатывал соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...