【问题标题】:Perl way to create sockets quickly (1000+)Perl 快速创建套接字的方法 (1000+)
【发布时间】:2011-03-16 00:55:04
【问题描述】:

我有一个 Perl 服务器,当它启动时,它连接到 1000 多个客户端。使用 SSL 设置所有连接大约需要 30-45 分钟。我正在尝试将开始时间减少到更合理的程度。我尝试使用线程来卸载工作,但无法让它工作。在一个线程中创建套接字并将其返回给调用者并不像预期的那样工作。尝试传递文件描述符并使用 IO::Socket::SSL->new_from_fd() 重新创建以在调用者中重新创建套接字,但失败了。

有人对如何快速创建这么多套接字有任何建议吗?或者至少比 O(n) 快...

更新:看来 POE 框架绝对是我想要探索的东西。文档听起来像是可以做我需要的。我现在正在构建一个概念证明,并且在访问会话中创建的 Socket 对象时遇到了麻烦。我可以在 POE 会话中创建套接字,但是在完成之后,我希望我的主程序将创建的套接字收集到一个哈希中。有人知道如何从 POE 会话中检索对象吗?

更新:有一个想法,包括使用全局变量并将套接字添加到会话中,或者保留对创建的会话的引用并访问它们的堆以聚合它们。马上试试……

【问题讨论】:

  • 你真的需要创建那么多套接字吗?会有开销,因为 SSL 身份验证不是即时的。
  • 是的,我知道 SSL 需要握手和所有设置开销,但我认为这是我唯一的选择。除非您知道一种方法来侦听可读套接字,而无需实际打开那么多套接字...我需要能够侦听来自套接字的数据,并且现在有 1,000 多个用户
  • 嗯.. 想想 Web 服务器是如何工作的。仅仅因为 Apache 可以同时处理 200 个(比如说)请求,并不意味着它在任何时候都打开了 200 个套接字。仅根据需要打开连接。
  • Apache 将监听一个套接字并根据需要打开新的套接字,是的,但是在与客户端通信时,它会保持这些新套接字的打开状态。这就是这里发生的事情。我的服务器正在这些打开的套接字上进行通信(只读),而不是监听新连接。一千个不同的客户端正在向我发送数据,我必须读取这些套接字。
  • 双向是我想走的路。我主要是接收数据,但偶尔会向客户端发送一些短命令。嗯,代理?我怎么能利用它?

标签: performance perl sockets ssl


【解决方案1】:

查看 POE 中的这个 TCP SSL Client 代码。该示例可以轻松扩展以执行您的要求。如果您之前没有在POE 中编码,则有一个学习曲线,但它非常好documented

【讨论】:

  • 谢谢,我会看看它是否满足我的需要
  • POE 看起来绝对可以做我想做的事。谢谢你的提示。在我将其用于我的真实代码之前,我正在尝试构建一个测试/概念证明,你对学习曲线的看法绝对正确。我了解如何在 POE 会话中创建我的套接字,但是我无法将 IO::Socket::SSL 对象返回到主程序中。文档说可以访问会话的数据存储,但我无法弄清楚。 POE Logic-启动一堆会话,每个会话在自己内部创建和存储一堆 Socket。最后,将它们全部收集到主程序中。
  • 您或任何有 POE 经验的人是否有任何提示访问会话的数据存储以收集我创建的 Socket SSL 对象?
  • 认为我有一个想法,使用全局变量或保留对会话的引用并访问它的堆,现在尝试......
  • 这可能是我想要的,只是还没开始工作。
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多