1

我正在尝试实现 Bittorrent 客户端。为了接收来自不同对等点的片段,客户端应该管理多个套接字。

我知道的著名解决方案是

  • 1、每个线程有一个socket。
  • 2.使用select()调用,非阻塞I/O。
  • 3. 1和2的混合。

    第一个解决方案需要太多线程。第二种解决方案会浪费 CPU 时间,因为它会继续检查最多 50 个套接字。另外,在决定使用第三种解决方案时,我不知道单个进程使用了​​多少个线程。

    哪个解决方案是最好的,接收一个相当大的文件?
    有没有什么网页可以给我一个很好的解决方案?

    任何建议都会很棒。

  • 4

    3 回答 3

    2

    我身边的一些高级想法。:)

    1. 有一个主线程,您将在其中对所有连接进行“选择”/“轮询”调用。
    2. 有一个工作线程的线程池
    3. 如果对于特定连接,select 表示有数据要读取,则将套接字 + 附加信息传递给空闲工作线程之一,用于在该连接上接收/发送数据。
    4. 工作完成后,工作线程返回空闲工作线程队列,可以再次用于另一个连接。

    希望这可以帮助

    于 2013-07-03T11:45:04.533 回答
    1

    你是对的,第一个解决方案是最糟糕的。第二个,withselect()可以完成这项工作,但是有一个问题:select()具有 log(n) 的复杂性。您应该使用/dev/poll,或其他任何东西epoll()kqueue()但不要使用select().

    不要每个套接字使用一个线程!由于上下文切换,您将浪费很多时间。

    你应该有:

    • 侦听器线程:只需完成所有操作accept并将新套接字放入 Worker 线程。
    • 多个工作线程:做所有其他的事情。它将检查是否有可用数据并进行处理。一个工作线程管理许多套接字。

    如果您想了解更多信息,请查看Kegel 的 c10k 页面。

    于 2013-07-03T12:31:03.353 回答
    0

    检查一些Open Source BitTorrent client并检查代码以获得一些想法,这是你能做的最好的事情。

    我建议您检查BitTorrentC 或 HadoukenC#,例如:

    https://github.com/bittorrent

    https://github.com/hadouken/hdkn

    于 2013-07-03T11:39:22.063 回答