none
HTTPS Port Sharing RRS feed

  • Общие обсуждения

  • Здравствуйте.
    Есть клиент-серверное ПО на C#. Клиент устанавливает постоянное защищенное TCP соединение через SslStream к серверному компоненту и далее они обмениваются данными по своему кастомному протоколу (передача команд двухсторонняя - и от клиента к серверу и от сервера к клиенту). В настоящий момент серверная часть работает по пользовательскому TCP порту (например, 9999).
    Задача - заставить серверную часть работать по порту 443. В настоящий момент на 443 работает IIS, VPN и RD Gateway. Как к нему подцепить и своё приложение с минимальными затратами по переписыванию кода?

Все ответы

  • Так HTTPS или свой протокол поверх TCP+SSL? В моем представлении, дело обстоит как-то так:

    В протоколе TCP, конечная точка однозначно определяется IP-адресом и номером порта. Соответственно, несколько программ могут вполне успешно слушать один и тот же TCP-порт, если у машины есть несколько IP-адресов. Однако, первая подключающаяся программа может запросить монопольный доступ на порт, тогда последующие попытки подключения к нему будут выдавать ошибку. См. TcpListener.ExclusiveAddressUse

    Если же используется HTTPS, то добавляется еще одна переменная: имя узла, которое передается в HTTP-заголовке. IIS, начиная с некоторой версии, позволяет привязывать несколько сайтов к одной паре (IP адрес; порт), разграничивая трафик на основе имени узла. 


  • Сейчас работает свой протокол поверх SSL - нужно свой протокол поверх HTTPS. IP-адрес один.
  • Тогда вам нужно переделать вашу программу в ASMX или WCF сервис, создать в IIS отдельный сайт с другим именем узла, и разместить в нем службу. Тогда основной сайт и сервис будут на одном и том же IP и порту, а запросы будут разграничиваться на основе имени узла. Само собой, для машины в DNS/WINS должно быть прописано несколько имен, чтобы это работало. 

    "IP-адрес один."

    Но можно же прописать дополнительные в настройках адаптера.

  • Как я понимаю, всё-таки без кардинального переписывания кода под WCF не обойтись (ASMX не подойдёт, т.к. нужна двухсторонняя передача данных) и дешевле будет купить второй ай-пи :(
  • Всё-таки нашёл я решение с минимальными доработками кода.

    На серверной стороне класс HttpListener позволил подцепиться к уже занятому порту 443  (в данном случае можно использовать один и тот же айпи и порт, но отдельный url). А обычный TCP Socket был заменён на WebSocket и соответствующий Stream. А вся логика работы программы осталась неизменной. Фактически был подменён только рабочий Stream.

    На клиенте, соответственно, был использован ClientWebSocket.

    23 октября 2017 г. 14:48