bnbt是应用较广的开源BT服务器(BT tracker)。下面分析一下bnbt tracker的主要流程(注意:没有使用数据库):

bnbt源码全部是C++,程序起点是bnbt.cpp中的main函数。其中首先解析命令行参数,然后是与Windows服务相关的处理,最后调用bnbtmain函数。

bnbtmain函数也在bnbt.cpp中。主要解析配置文件、设置大量运营参数,然后创建CServer的实例gpServer,最后是在死循环中不断调用gpServer.Update().

CServer类是在server.cpp中定义的。

CServer构造函数的主要工作是绑定监听端口,实际是建立了一个server,最后创建了CTracker的实例m_pTracker.

CServer类的Update()函数主要功能是处理连接上来的BT客户端。如果客户端队列m_vecClients未满(缺省最大64),则为每个连接创建1个CClient实例,并将其压入m_vecClients尾部。然后,依次执行m_vecClients中各CClient对象的Update函数,并将返回值为true的对象释放掉。

CClient类是在client.cpp中定义的。其构造函数很简单,重点是Update()函数。Update()函数的功能是处理BT客户端的请求。具体说,从socket连接读取信息,按照HTTP协议进行了分析,转化成GET和POST请求调用CServerCTrackerserverResponseGET()和serverResponsePOST()函数处理,将处理返回的结果再返给BT客户端。

CTracker类是在tracker.cpp中定义的。

serverResponsePOST()中只处理POST方式的”/upload.html”的请求,即上载页面。

serverResponseGET()是重点,处理以下请求:

  • /或/index.html:主界面,显示BT文件和以下各网页的链接
  • /announce:处理BT客户端访问,并返回其他BT客户端的ip:port列表,是tracker的核心功能
  • /scrape:可以通过scrape协议读取可下载的bt文件信息
  • /stats.html:显示统计信息
  • /torrents/:torrents是默认的存放torrent文件的目录,可以在配置文件中设置存放到其他目录
  • /files/:显示可下载的bt文件
  • /robots.txt:定义搜索引擎访问规则的robots.txt
  • /login.html:用户登录界面
  • /signup.html:用户注册界面
  • /upload.html:GET方式的上载界面
  • /info.html:tracker基本信息,包括版本、当前时间、运转时间、文件数、用户数。
  • /admin.html:admin界面
  • /users.html:用户信息界面
  • /comments.html:对文件注释

通过上文的分析可以看出,bnbt(也就是tracker)实际是一个socket服务器,但模拟成web server。很有意思:)bnbt对外是100%的web server。所以,用java或php重新写一套bt服务器,运行在web server上是完全没有问题的。

/announce是bnbt实现的各http页面中最核心的,也是bt客户端唯一访问的页面。BT服务器与客户端之间是通过基于HTTP的bt协议进行通讯,在bnbt源码中由CTracker.serverResponseAnnounce()函数实现。下篇文章我们将专门谈论这个函数。

除了/announce以外,其他页面都是可选的,所以很多bnbt服务器只提供部分。有兴趣的话,可以参看这个德国服务器,功能提供得比较全。

转载请注明来自:jijian91与小z - 编程

永久链接:http://jijian91.com/blog20071018/bnbt-tracker-analysis.html