Fatal
написал 13 января 2005 года в 15:36 (699 просмотров)
Ведет себя
как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.
Подскажите, пожалуйста, что происходит если запустить два сервера как два разных процесса на одной машине, которые прослушивают одинаковый порт. И подключаться к ним клиентами. Все клиенты используют адрес 127.0.0.1. К какому из серверов произойдёт подключение и почему?
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Если я не ошибаюсь, к единственному — второй просто не запустится, точнее порт ему не дадут. Нормальный сервер в таком случае ругнётся и умрёт :)
дело в том, что я написал прогу, в которой это дело не отслеживается. и мне бы хотелось узнать, что же происходит, к какому серверу и почему подключаются клиенты
второму не дадут слушать порт. скорее всего будет либо segfault либо вечный loop, пока первый не отвалится.
Значит у тебя оно не ругается и не умирает.
Но порт всё равно не слушает. Висит.
я думал, там какие-то интересные процессы происходят, а он просто виснит и всё, ну… так не интерестно.
Большое спасибо, за ответы!
bind() на уже занятый порт не получится. Ядро скажет процессу «пшел нах, заходите попозже».
у меня получилось, но все они зависли, в смысле сервера и клиенты
подскажите, пожалуйста, возможно ли следующее:
1.
а) сервер слушает сокет
б) клиент подключается к серверу
2.
а)ждёт подключеня второго клиента, и когда он подключается сервер закрывает прослушиваемый сокет
3.
а) сервер пораждает процесс копию fork-ом, закрывает сокеты (2 сокета) для передачи данных у потомка, у родителя они остаются открытыми, и пораждает самого себя через функцию execl
4.
a) сервер отсылает данные двум клиентам
б) соответственно они получают их.
5. далее сервер с клиентами обрабатывают эти данные и обмениваются ими
То есть получается, что каждый процесс-сервер должен общаться только с друмя клиентами.
вопрос:
возможно ли подключения клиентов к вновь породившемуся серверу через execl? если такой вариант должен проходить, возможно у меня ошибка в чем-то другом, у меня клиенты ко второму серверу не подключаются ошибка Connection refused при соединении (функция connect()).
у меня эту задачу «каждый процесс-сервер должен общаться только с друмя клиентами» получлось решить следующим алгоритмом
создается отдельный процесс, в задачу которого входит открыть дескриптор для прослушивания и установать его под определённым номером (к примеру номер 4) с помощью функции dup2(). и все процессы сервера будут слушать именно этот сокет, а далее тотже алгоритм, только закрытие прослушиваемого сокета происходит после порождения нового процесса:
1.
а) сервер слушает сокет
б) клиент подключается к серверу
2.
а)ждёт подключеня второго клиента
3.
а) сервер пораждает процесс копию fork-ом, закрывает сокеты (2 сокета) для передачи данных у потомка, у родителя они остаются открытыми, и пораждает самого себя через функцию execl
4.
а) затем сервер закрывает прослушиваемый сокет
5.
a) сервер отсылает данные двум клиентам
б) соответственно они получают их.
6. далее сервер с клиентами обрабатывают эти данные и обмениваются ими
вопрос:
почему при первом алгоритме не получается осуществить задачу «каждый процесс-сервер должен общаться только с друмя клиентами», а при втором — получается?
тема перенесена на http://www.nixp.ru/cgi-bin/forum/YaBB.pl?board=coding;action=display;num=1105708693;start=0#0
А проверять возвращаемое bind-ом значение Дядя Федя будет или кто?
почему вы решили, что я этого не делал?