【问题标题】:Socket Performance C++ Or C#套接字性能 C++ 或 C#
【发布时间】:2011-02-15 22:33:17
【问题描述】:

我必须编写一个本质上是代理服务器的应用程序来处理来自我们服务器的所有 HTTP 和 HTTPS 请求(网页浏览等)。我对 C++ 知之甚少,并且很擅长用 C# 编写应用程序功能。

我已经尝试过来自Mentalis(C# 套接字代理)的代理,它似乎适用于小型网页,但如果我去像tigerdirect.ca 这样的大型网站并浏览几层,它会很慢,有时请求未完成,我看到损坏的图像和 javascript 错误。我们所有的供应商网站和其他内容繁重的网站都会发生这种情况。

Mentalis 使用 HTTP 1.0,我知道它效率不高,但代理应该那么慢吗?使用代理的可接受的性能损失量是多少? HTTP 1.1 会产生明显的不同吗?

C++ 代理会比 C# 中的代理快得多吗? Mentalis 代码效率不高吗? 我是否能够使用预制的 C++ 代理并将 DLL 导入 C# 并仍然获得良好的性能,或者这个项目是否需要所有 C++?

对不起,如果这些问题很明显,但我以前没有做过网络编程。

编辑 回答 Joshua 的问题:我不一定需要自己编写核心代理服务器,只要有一个好的实现,但就像我说的那样,我一直在试验 Mentalis表现不佳。最终的应用程序需要通过单个安装程序安装在 Windows PC/Server 上,手动配置为 0。

我可以在安装程序中编写所有必要的注册表编辑,就像我之前在 C# 中所做的那样。

更新 我听取了 Aaronaught 的建议,并着手改进 Mentalis 的代码。我修复了一个问题,因此它可以与 HTTP 1.1 一起使用,允许它与 Chrome 和 Firefox 一起使用(Windows 上的 Safari 4 会因某种原因使代理崩溃)。

当我在 FireFox 和 Chrome 中进行测试时,我发现不存在性能问题,这意味着这是 IE 问题而不是代理问题。重置浏览历史设置后,问题就消失了。

谢谢大家!

【问题讨论】:

  • 您能讨论一下为什么需要自己编写而不是使用 nginx 或 Haproxy 之类的东西吗?
  • 我不一定需要自己编写核心代理服务器,只要有一个好的实现,但就像我说的那样,我一直在试验 Mentalis,它的性能并不好。最终的应用程序需要通过单个安装程序安装在 Windows PC/Server 上,手动配置为 0。

标签: c# c++ sockets proxy


【解决方案1】:

与您选择的平台相比,您实际设计和编码应用程序的方式将产生无限大的差异。

如果你有效地设计服务器,它就会很高效。如果你的设计效率低下,它就会效率低下。选择 C++ 而不是 C# 没有明显的优势,反之亦然……除非您必须从头开始学习整个语言,这是一个巨大的负面影响(当您几乎不了解这些工具时,很难提出一个好的设计)。

对于此类应用程序,您可能必须了解的事项:

  • I/O 完成端口
  • 一般的线程池和多线程
  • 网络协议(包括 HTTP、FTP、TCP 等)- 尤其适用于错误处理
  • 证书和签名/加密(用于 SSL/HTTPS)
  • ...

老实说,您在这里谈论的是一项不平凡的工作。我的意思并不是听起来过于消极,但是是什么让您认为如果没有对底层网络协议和代理设计的广泛了解,您可以做得更好?为什么不看看 Mentalis 代理源代码,看看是否可以改进它,而不是尝试从头开始编写自己的代码?前者肯定比后者容易。

无论如何,一个套接字就是一个套接字; .NET 套接字只不过是 Windows 套接字上的纸薄包装器,因此在 C++ 中性能不会有明显不同。

【讨论】:

  • +1 非常务实的建议。正如艾萨克牛顿曾经说过的“如果我能比别人看得更远,那是因为我站在了巨人的肩膀上。”
  • 投反对票的原因是 -> “所以 C++ 中的性能不会有明显不同”。实际上,高性能服务器要求会有很多性能差异。例如,网络数据包的小边界检查(通过 .Net)将在高度可扩展和高性能的服务器中增加显着的性能开销。
【解决方案2】:

C++ 不是一门容易学习的语言。再加上缺乏网络经验,你就处于一个全新的领域。如果你想探索——很好,你会犯所有的错误并学到很多东西。另一方面,如果您需要在某个日期之前交付一些东西 - 选择您目前觉得合适的任何东西。

【讨论】:

  • 感谢 Nikolai,如果 C# 可以处理该任务,这就是我想做的。
【解决方案3】:

如果您想编写一个真正快速、干净、实用的服务器,请使用 C++ 或纯 C。

C++ 不是一门简单的语言,而且很容易被误用。 C++ 需要纪律来实际阅读和思考困难的书籍。使用得当,它是目前最好的系统编程语言。

如果性能不是问题,您可以使用更松散的工具,例如 C#。

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2019-02-10
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多