Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?
Здравствуйте, Интересующийся, Вы писали:
И>Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?
Нет (если не рассматривать решения, использующие не только сокеты; например можно настроить DNAT на сборку всех входящих пакетов с диапазона портов и перенаправления их на единственного слушателя).
Здравствуйте, Интересующийся, Вы писали:
И>Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?
Представим, что надо теперь запустить ДВЕ софтины с таким поведением. Каждая пытается слушать порты 2000-30000 целым диапазоном. Кому давать входящий пакет? Всем? А если это банк-клиенты двух разных банков? Шутка, конечно, но в ней доля шутки.
Кстати. Можно применить всякие ZeroConf, UPNP и прочий бонжур, и тогда клиенты смогут сами рассказать, куда будут ломится.
Re[2]: Сокет сервер для группы портов
От:
Аноним
Дата:
31.05.13 13:10
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, Интересующийся, Вы писали:
И>>Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?
MD>Представим, что надо теперь запустить ДВЕ софтины с таким поведением. Каждая пытается слушать порты 2000-30000 целым диапазоном. Кому давать входящий пакет? Всем?
И какая тут разница, будет программа слушать тысячу портов или только один? Кто первый запустился и сделал bind, тот и получает ресурс в своё пользование, остальные получают ошибку. Ситуация с конкурированием за номера портов как раз полностью стандартная.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Mr.Delphist, Вы писали:
MD>>Здравствуйте, Интересующийся, Вы писали:
И>>>Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?
MD>>Представим, что надо теперь запустить ДВЕ софтины с таким поведением. Каждая пытается слушать порты 2000-30000 целым диапазоном. Кому давать входящий пакет? Всем? А>И какая тут разница, будет программа слушать тысячу портов или только один? Кто первый запустился и сделал bind, тот и получает ресурс в своё пользование, остальные получают ошибку. Ситуация с конкурированием за номера портов как раз полностью стандартная.
Дык суть, что портов всего-то 65 тысяч, и если каждая софтина будет себе хапать биндинги по 20-30 тыщ портов эксклюзивно, то уютному Беркли-мирочку сокетов быстро придёт конец
Здравствуйте, Mr.Delphist, Вы писали:
MD>Представим, что надо теперь запустить ДВЕ софтины с таким поведением. Каждая пытается слушать порты 2000-30000 целым диапазоном. Кому давать входящий пакет? Всем? А если это банк-клиенты двух разных банков? Шутка, конечно, но в ней доля шутки.
Это не аргумент, потому что в этом плане программа, слушающая один порт, ничем принципиально не отличается от программы, слушающей диапазон. Соответсвенно, и решение такое же подходит: кто первый встал, того и тапки, а второму — EADDRINUSE. Но увы, сокетный API не позволяет "подписать" сокет на более, чем один порт.
Re[4]: Сокет сервер для группы портов
От:
Аноним
Дата:
31.05.13 15:44
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, Mr.Delphist, Вы писали:
MD>>>Здравствуйте, Интересующийся, Вы писали:
И>>>>Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?
MD>>>Представим, что надо теперь запустить ДВЕ софтины с таким поведением. Каждая пытается слушать порты 2000-30000 целым диапазоном. Кому давать входящий пакет? Всем? А>>И какая тут разница, будет программа слушать тысячу портов или только один? Кто первый запустился и сделал bind, тот и получает ресурс в своё пользование, остальные получают ошибку. Ситуация с конкурированием за номера портов как раз полностью стандартная.
MD>Дык суть, что портов всего-то 65 тысяч, и если каждая софтина будет себе хапать биндинги по 20-30 тыщ портов эксклюзивно, то уютному Беркли-мирочку сокетов быстро придёт конец
Глупости.
И таки какая разница между тысячами и одним? Уже сегодня нельзя поднять два http-сервера на одном интерфейсе, ибо порт с номером 80 всего один такой. Не надо создавать тысяч сокетов, уже один способен полностью исчерпать список допустимых портов для http.
Если программе нужен не 1 порт, а тысяча для работы, то пусть использует.
Здравствуйте, watch-maker, Вы писали:
WM>Нет (если не рассматривать решения, использующие не только сокеты; например можно настроить DNAT на сборку всех входящих пакетов с диапазона портов и перенаправления их на единственного слушателя).
Спасибо за интересную мысль.
Я так понял, что это для Linux. У меня везде Винды. Я написал вопрос без общей задачи, которая есть:
Нужно протестировать разработанное ПО для очень удаленного управления аппаратурой земной станции, для чего надо сымитировать ограничение скорости, задержки в сети.
Думал написать что-то вроде сетевого экрана. Похоже, что стандартным сокетом не обойтись и нужно писать собственный сокет с поддержкой протокола на нижнем уровне — это долго (наработок нет). Склоняюсь купить готовый пакет типа NetDisturb фирмы ZTI.
Здравствуйте, Интересующийся, Вы писали:
И>Нужно протестировать разработанное ПО для очень удаленного управления аппаратурой земной станции, для чего надо сымитировать ограничение скорости, задержки в сети. И> Думал написать что-то вроде сетевого экрана.
Поднимите на виртуалке Linux, на нем — маршрутизатор какой-нибудь или просто port forwarding один в один, и дальше netem ( http://www.linuxfoundation.org/collaborate/workgroups/networking/netem ). Не так, чтобы совсем уж готовое из коробки решение, но бесплатно, и быстрее, чем самому велосипед изобретать.
А>И таки какая разница между тысячами и одним? Уже сегодня нельзя поднять два http-сервера на одном интерфейсе, ибо порт с номером 80 всего один такой. Не надо создавать тысяч сокетов, уже один способен полностью исчерпать список допустимых портов для http.
Гым-гым... У меня сейчас под боком на 80 порту сайт, на 8080 порту Джира, на 8090 Confluence, на 8070 порту — FishEye. И это всё при этом:
1) один и тот же компьютер (точнее, виртуалка)
2) разные http-сервера: web-сайт на IIS, остальные три софтины — каждый на своём инстансе TomCat
3) это всё http, браузер спокойно открывает в разных вкладках...
Re[4]: Сокет сервер для группы портов
От:
Аноним
Дата:
03.06.13 11:14
Оценка:
Здравствуйте, _stun_, Вы писали:
__>Здравствуйте, Интересующийся, Вы писали:
И>>Нужно протестировать разработанное ПО для очень удаленного управления аппаратурой земной станции, для чего надо сымитировать ограничение скорости, задержки в сети. И>> Думал написать что-то вроде сетевого экрана.
__>Поднимите на виртуалке Linux, на нем — маршрутизатор какой-нибудь или просто port forwarding один в один, и дальше netem ( http://www.linuxfoundation.org/collaborate/workgroups/networking/netem ). Не так, чтобы совсем уж готовое из коробки решение, но бесплатно, и быстрее, чем самому велосипед изобретать.