nixp.ru v3.0

23 января 2017,
понедельник,
03:40:51 MSK

Аутсорсинг Linux с компанией «Флант»
Fatal написал 13 января 2005 года в 15:36 (233 просмотра) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

Подскажите, пожалуйста, что происходит если запустить два сервера как два разных процесса на одной машине, которые прослушивают одинаковый порт. И подключаться к ним клиентами. Все клиенты используют адрес 127.0.0.1. К какому из серверов произойдёт подключение и почему?

Dreid
Fatal
Подскажите, пожалуйста, что происходит если запустить два сервера как два разных процесса на одной машине, которые прослушивают одинаковый порт. И подключаться к ним клиентами. Все клиенты используют адрес 127.0.0.1. К какому из серверов произойдёт подключение и почему?

Если я не ошибаюсь, к единственному — второй просто не запустится, точнее порт ему не дадут. Нормальный сервер в таком случае ругнётся и умрёт :)

Fatal

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

decvar

второму не дадут слушать порт. скорее всего будет либо segfault либо вечный loop, пока первый не отвалится.

Dreid
Fatal
дело в том, что я написал прогу, в которой это дело не отслеживается. и мне бы хотелось узнать, что же происходит, к какому серверу и почему подключаются клиенты

Значит у тебя оно не ругается и не умирает.

Но порт всё равно не слушает. Висит.

Fatal

я думал, там какие-то интересные процессы происходят, а он просто виснит и всё, ну… так не интерестно.

Большое спасибо, за ответы!

Longobard

bind() на уже занятый порт не получится. Ядро скажет процессу «пшел нах, заходите попозже».

Fatal
LONGOBARD
bind() на уже занятый порт не получится. Ядро скажет процессу «пшел нах, заходите попозже».

у меня получилось, но все они зависли, в смысле сервера и клиенты

Fatal

подскажите, пожалуйста, возможно ли следующее:

1.

а) сервер слушает сокет

б) клиент подключается к серверу

2.

а)ждёт подключеня второго клиента, и когда он подключается сервер закрывает прослушиваемый сокет

3.

а) сервер пораждает процесс копию fork-ом, закрывает сокеты (2 сокета) для передачи данных у потомка, у родителя они остаются открытыми, и пораждает самого себя через функцию execl

4.

a) сервер отсылает данные двум клиентам

б) соответственно они получают их.

5. далее сервер с клиентами обрабатывают эти данные и обмениваются ими

То есть получается, что каждый процесс-сервер должен общаться только с друмя клиентами.

вопрос:

возможно ли подключения клиентов к вновь породившемуся серверу через execl? если такой вариант должен проходить, возможно у меня ошибка в чем-то другом, у меня клиенты ко второму серверу не подключаются ошибка Connection refused при соединении (функция connect()).

Fatal

у меня эту задачу «каждый процесс-сервер должен общаться только с друмя клиентами» получлось решить следующим алгоритмом

создается отдельный процесс, в задачу которого входит открыть дескриптор для прослушивания и установать его под определённым номером (к примеру номер 4) с помощью функции dup2(). и все процессы сервера будут слушать именно этот сокет, а далее тотже алгоритм, только закрытие прослушиваемого сокета происходит после порождения нового процесса:

1.

а) сервер слушает сокет

б) клиент подключается к серверу

2.

а)ждёт подключеня второго клиента

3.

а) сервер пораждает процесс копию fork-ом, закрывает сокеты (2 сокета) для передачи данных у потомка, у родителя они остаются открытыми, и пораждает самого себя через функцию execl

4.

а) затем сервер закрывает прослушиваемый сокет

5.

a) сервер отсылает данные двум клиентам

б) соответственно они получают их.

6. далее сервер с клиентами обрабатывают эти данные и обмениваются ими

вопрос:

почему при первом алгоритме не получается осуществить задачу «каждый процесс-сервер должен общаться только с друмя клиентами», а при втором — получается?

Fatal

тема перенесена на http://www.nixp.ru/cgi-bin/forum/YaBB.pl?board=coding;action=display;num=1105708693;start=0#0

Longobard
Fatal
у меня получилось, но все они зависли, в смысле сервера и клиенты

А проверять возвращаемое bind-ом значение Дядя Федя будет или кто?

Fatal
LONGOBARD
А проверять возвращаемое bind-ом значение Дядя Федя будет или кто?

почему вы решили, что я этого не делал?

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.