我正在尝试实现 Bittorrent 客户端。为了接收来自不同对等点的片段,客户端应该管理多个套接字。
我知道的著名解决方案是
select()
调用,非阻塞I/O。
第一个解决方案需要太多线程。第二种解决方案会浪费 CPU 时间,因为它会继续检查最多 50 个套接字。另外,在决定使用第三种解决方案时,我不知道单个进程使用了多少个线程。
哪个解决方案是最好的,接收一个相当大的文件?
有没有什么网页可以给我一个很好的解决方案?
任何建议都会很棒。
我正在尝试实现 Bittorrent 客户端。为了接收来自不同对等点的片段,客户端应该管理多个套接字。
我知道的著名解决方案是
select()
调用,非阻塞I/O。
第一个解决方案需要太多线程。第二种解决方案会浪费 CPU 时间,因为它会继续检查最多 50 个套接字。另外,在决定使用第三种解决方案时,我不知道单个进程使用了多少个线程。
哪个解决方案是最好的,接收一个相当大的文件?
有没有什么网页可以给我一个很好的解决方案?
任何建议都会很棒。
我身边的一些高级想法。:)
希望这可以帮助
你是对的,第一个解决方案是最糟糕的。第二个,withselect()
可以完成这项工作,但是有一个问题:select()
具有 log(n) 的复杂性。您应该使用/dev/poll
,或其他任何东西epoll()
,kqueue()
但不要使用select()
.
不要每个套接字使用一个线程!由于上下文切换,您将浪费很多时间。
你应该有:
accept
并将新套接字放入 Worker 线程。如果您想了解更多信息,请查看Kegel 的 c10k 页面。
检查一些Open Source BitTorrent client
并检查代码以获得一些想法,这是你能做的最好的事情。
我建议您检查BitTorrent
C 或 Hadouken
C#,例如: