【问题标题】:Implementing threading for a TCP proxy server using Async sockets使用异步套接字为 TCP 代理服务器实现线程
【发布时间】:2012-10-01 23:13:35
【问题描述】:

我有一个自定义 TCP 代理服务器正在侦听端口 5888(虚拟端口)。代理服务器侦听传入连接。当代理接收到某些页面的HTTP请求时,它应该将其中继到主服务器的80端口。对于其他页面请求,代理需要将数据发送到主服务器的8081端口。

端口 80 用于服务 HTML 页面,而端口 8081 用于将数据流式传输到客户端。

Client --> Proxy(TCP Proxy Server) --> MainServer
Client <-- Proxy(TCP Proxy Server) <-- MainServer

我已经使用异步编程模型(BeginXX 和 EndXX)实现了代理。代理工作正常。我可以将大约 10 个客户端连接到此代理。

现在我想在代理中实现线程,这样我就可以有超过 300 个同时连接到代理的客户端。考虑到异步编程模型(异步套接字),实现此线程的最佳方法是什么。

【问题讨论】:

    标签: c# multithreading tcp proxy asyncsocket


    【解决方案1】:

    听起来你想要线程是为了线程。

    添加额外线程究竟会解决什么问题?

    鉴于异步模型回调到 ThreadPool,您已经免费获得“线程”。你为什么想要更多?

    您可以在读取操作的异步回调中愉快地从一个流复制到另一个流。如果您也使用 async 进行写入,它不会对 ThreadPool 造成任何重大负担,IMO 最好将工作留在那里。

    您是否考虑过为此使用 async/await?如果它是一个选项,它将使您的代码在大脑中的嵌套程度更轻。

    【讨论】:

    • 感谢您的回复。我正在使用 Visual Studio 2010,即带有 BeginXX 和 EndXX 的异步模型。我不想为了线程而使用线程——我唯一担心的是程序是否会处理来自客户端的 300 个同时连接。
    • @LivNow 我建议这是您需要测试的东西,而不是优化可能不是问题的东西。如果您所做的只是使用轻逻辑复制流,那么除了在读取操作的回调中之外,我看不到任何需要在任何地方执行工作。只要确保你在读写 IO 上保持完全异步,这样你就永远不会用长时间运行/阻塞操作阻塞线程池,你会远远超过 300。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多