2010-05-05 3 views
2

Мне нужно написать приложение, которое по существу является прокси-сервером для обработки всех запросов HTTP и HTTPS с нашего сервера (просмотр веб-страниц и т. Д.). Я знаю очень мало C++ и очень удобно писать функции приложения на C#.Socket Performance C++ или C#

Я экспериментировал с прокси-сервером от Mentalis (прокси-сервер сокета C#), который, кажется, отлично работает для небольших веб-страниц, но если я перехожу на большие сайты, такие как tigerdirect.ca, и просматриваю пару слоев, это очень медленно, а иногда и запросы не заканчиваются, и я вижу сломанные изображения и ошибки JavaScript. Это происходит со всеми нашими сайтами поставщиков и другими тяжелыми сайтами контента.

Mentalis использует HTTP 1.0, который, как я знаю, не так эффективен, но должен ли прокси быть таким медленным? Какова допустимая потеря производительности при использовании прокси-сервера? Будет ли HTTP 1.1 иметь заметную разницу?

Будет ли прокси C++ намного быстрее, чем один в C#? Является ли код Mentalis просто неэффективным? Смогу ли я использовать предварительно прокси-сервер C++ и импортировать DLL на C# и по-прежнему получать хорошую производительность или будет ли этот проект вызывать для всех C++?

Извините, если это очевидные вопросы, но я еще не делал сетевого программирования.

EDIT В ответ на вопрос Иисуса Навина: Я не обязательно нужен писать основной прокси-сервер сам до тех пор, пока существует хорошая реализация там, но, как я сказал, что я экспериментировал с подбородочной мышцей, которая не является выполняя это хорошо. Окончательное приложение необходимо установить на ПК с Windows из одного установщика с ручной настройкой 0.

Я могу написать все необходимые изменения реестра в установщике, как это было сделано ранее в C#.

ОБНОВЛЕНИЕ Я взял совет Аароноу и изучил код Менталиса. Я исправляю проблему, так что она работает с HTTP 1.1, позволяя ему работать с Chrome и Firefox (Safari 4 на Windows сбрасывает прокси-сервер, хотя по какой-то причине).

Когда я тестировал в FireFox и Chrome, я обнаружил, что проблем с производительностью не было, что подразумевало, что проблема с IE не является проблемой с прокси-сервером. После сброса настроек истории просмотра проблема исчезла.

Спасибо всем!

+1

Не могли бы вы обсудить, почему вам нужно писать свои собственные, а не использовать что-то вроде nginx или Haproxy? –

+0

Мне не обязательно самостоятельно писать основной прокси-сервер, если есть хорошая реализация, но, как я уже сказал, я экспериментировал с Mentalis, который не очень хорошо работает. Окончательное приложение необходимо установить на ПК с Windows из одного установщика с ручной настройкой 0. – modernzombie

ответ

9

Как вы на самом деле разрабатываете и кодируете приложение, вы будете делать бесконечно большую разницу, чем платформа, которую вы выбираете.

Если вы эффективно сконструируете сервер, он будет эффективным. Если вы создадите его неэффективно, это будет неэффективно. Нет никакого явного преимущества в выборе C++ над C# или наоборот ... если вам не придется изучать весь язык с нуля, что является огромным негативным (трудно придумать хороший дизайн, когда вы едва знаете инструменты).

Вещи вы, вероятно, должны понять, для такого применения:

  • I/O порты завершения
  • Пулы потоков и многопоточность в целом
  • сетевых протоколов (включая HTTP, FTP , TCP и т.д.) - особенно для обработки
  • Сертификаты ошибки и подписи/шифрования (для SSL/HTTPS)
  • ...

Честно говоря, вы говорите о нетривиальном начинании здесь. Я не хочу звучать слишком негативно, но что заставляет вас думать, что вы можете сделать лучшую работу без обширного знания базовых сетевых протоколов и прокси-дизайна? Почему бы вам не взглянуть на исходный код Mentalis Proxy и посмотреть, можете ли вы его улучшить, а не пытаться написать свой собственный с нуля? Конечно, первое было бы легче, чем последнее.

В любом случае, розетка представляет собой розетку; Сокеты .NET не намного больше, чем бумажные обертки поверх сокетов Windows, поэтому производительность не будет заметно отличаться на C++.

+0

+1 Для очень прагматичного совета. Как однажды сказал Исаак Ньютон * «Если бы я мог видеть дальше других, это потому, что я стоял на плечах гигантов». * – ChaosPandion

1

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

+0

Спасибо, Николай, это то, что я хочу сделать, если C# справится с задачей. – modernzombie

0

Если вы хотите, чтобы написать очень быстро, чисто, вниз к металлическому сервера, пойти с C++ или простой C.

C++ не является легким языком и легко неправильного использования. C++ требует, чтобы дисциплина действительно читала и размышляла о трудных книгах. Используется правильно, это лучший язык системного программирования.

Если производительность не является проблемой, вы можете использовать пушистые инструменты, такие как C#.