Сокет сервер для группы портов
От: Интересующийся Россия  
Дата: 31.05.13 11:03
Оценка:
Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?
Re: Сокет сервер для группы портов
От: watch-maker  
Дата: 31.05.13 11:53
Оценка: 1 (1)
Здравствуйте, Интересующийся, Вы писали:

И>Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?

Нет (если не рассматривать решения, использующие не только сокеты; например можно настроить DNAT на сборку всех входящих пакетов с диапазона портов и перенаправления их на единственного слушателя).
Re: Сокет сервер для группы портов
От: Mr.Delphist  
Дата: 31.05.13 13:02
Оценка:
Здравствуйте, Интересующийся, Вы писали:

И>Можно ли и как использовать один 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, тот и получает ресурс в своё пользование, остальные получают ошибку. Ситуация с конкурированием за номера портов как раз полностью стандартная.
Re[3]: Сокет сервер для группы портов
От: Mr.Delphist  
Дата: 31.05.13 15:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Mr.Delphist, Вы писали:


MD>>Здравствуйте, Интересующийся, Вы писали:


И>>>Можно ли и как использовать один Socket (C# AddressFamily.InterNetwork, ProtocolType.Tcp, фиксированные адреса сервера и клиентов) для прослушивания (и последующего соединения в новом сокете) сразу группы портов (2000-30000)?


MD>>Представим, что надо теперь запустить ДВЕ софтины с таким поведением. Каждая пытается слушать порты 2000-30000 целым диапазоном. Кому давать входящий пакет? Всем?

А>И какая тут разница, будет программа слушать тысячу портов или только один? Кто первый запустился и сделал bind, тот и получает ресурс в своё пользование, остальные получают ошибку. Ситуация с конкурированием за номера портов как раз полностью стандартная.

Дык суть, что портов всего-то 65 тысяч, и если каждая софтина будет себе хапать биндинги по 20-30 тыщ портов эксклюзивно, то уютному Беркли-мирочку сокетов быстро придёт конец
Re[2]: Сокет сервер для группы портов
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.05.13 15:28
Оценка:
Здравствуйте, 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 порт, а тысяча для работы, то пусть использует.
Re[3]: Сокет сервер для группы портов
От: _stun_ Россия  
Дата: 01.06.13 08:51
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz> Но увы, сокетный API не позволяет "подписать" сокет на более, чем один порт.


А какой позволяет?
Re[4]: Сокет сервер для группы портов
От: Pzz Россия https://github.com/alexpevzner
Дата: 01.06.13 10:25
Оценка:
Здравствуйте, _stun_, Вы писали:

Pzz>> Но увы, сокетный API не позволяет "подписать" сокет на более, чем один порт.


__>А какой позволяет?


А какой еще бывает?
Re[5]: Сокет сервер для группы портов
От: _stun_ Россия  
Дата: 01.06.13 11:29
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>А какой еще бывает?


Ну вот и мне интересно. Может, Вы Plan 9 какой-нибудь на досуге мучаете конструкциями типа announce("tcp!*!*", adir), и он даже работает
Re[2]: Сокет сервер для группы портов
От: Интересующийся Россия  
Дата: 03.06.13 05:47
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>Нет (если не рассматривать решения, использующие не только сокеты; например можно настроить DNAT на сборку всех входящих пакетов с диапазона портов и перенаправления их на единственного слушателя).


Спасибо за интересную мысль.
Я так понял, что это для Linux. У меня везде Винды. Я написал вопрос без общей задачи, которая есть:
Нужно протестировать разработанное ПО для очень удаленного управления аппаратурой земной станции, для чего надо сымитировать ограничение скорости, задержки в сети.
Думал написать что-то вроде сетевого экрана. Похоже, что стандартным сокетом не обойтись и нужно писать собственный сокет с поддержкой протокола на нижнем уровне — это долго (наработок нет). Склоняюсь купить готовый пакет типа NetDisturb фирмы ZTI.
Re[3]: Сокет сервер для группы портов
От: _stun_ Россия  
Дата: 03.06.13 07:46
Оценка: 2 (1)
Здравствуйте, Интересующийся, Вы писали:

И>Нужно протестировать разработанное ПО для очень удаленного управления аппаратурой земной станции, для чего надо сымитировать ограничение скорости, задержки в сети.

И> Думал написать что-то вроде сетевого экрана.

Поднимите на виртуалке Linux, на нем — маршрутизатор какой-нибудь или просто port forwarding один в один, и дальше netem ( http://www.linuxfoundation.org/collaborate/workgroups/networking/netem ). Не так, чтобы совсем уж готовое из коробки решение, но бесплатно, и быстрее, чем самому велосипед изобретать.
Re[5]: Сокет сервер для группы портов
От: Mr.Delphist  
Дата: 03.06.13 10:32
Оценка:
А>И таки какая разница между тысячами и одним? Уже сегодня нельзя поднять два 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 ). Не так, чтобы совсем уж готовое из коробки решение, но бесплатно, и быстрее, чем самому велосипед изобретать.


Спасибо за ссылку. Идем ставить Linux и iproute2.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.