« Go 语言初学实践(2) | 返回首页 | 梦幻西游服务器 IO 问题 »

Go 语言初学实践(3)

这几天一直在写个小东西,基本也做完了。抽点时间贴段代码继续这个系列。

我写的 http server 在支持断点续传时碰到个小的算法问题。就是我希望用户在完整下载完一次指定文件后,就让这个文件 URL 失效。而如果用户不断的从中间开始分段下载的话,很难从统计下载字节数来判定整个文件是否下载完一次。

我希望把下载完一次的标准定为,文件的每个字节都至少被请求一次。这个问题用线段树来实现最为贴切。当然还会有各种其它方案,就不展开讨论了。

这里的代码有很大的优化余地,但是就具体应用来说,性能方面也足够了。严谨点来说,我在服务器上额外增加了一些判断,防止被恶意攻击。比如如果分段太多(恶意的每间隔一个字节请求一个字节)对于大文件会导致这个数据结构占据过多内存。这时直接掐断服务即可,这里不展开讨论。

今天贴的代码和 C 很接近。没什么特别有特色的地方。不过,Go 的 Slice 的确很好用,还有 Built-in 的函数 copy ,这些都使得 Go 比 C 在处理数据块上更方便和安全。

代码在这里。暂时 Blog 系统没支持 Go ,所以换个位置贴了。


btw, 受周爱民同学邀请,明天我将去支付宝给那里的同学介绍一下 Go 语言。我自己也是初学乍练 。最近多用 Go 写点小程序,也是为了稍微熟悉一点。希望明天不要让人太失望了。

Comments

能不能把你写的http server 源代码共享下,谢谢
gcc 4.6已加入go支持 Go Support for the Go programming language has been added to GCC. It is not enabled by default when you build GCC; use the --enable-languages configure option to build it. The driver program for compiling Go code is gccgo.
毕业后第一次看到有人用线段数。不过,你这问题,貌似不用自己写线段树吧。stl::set > 完全可以实现。插入的时候注意能合并就合并。当set里只有一个元素并且 end = filesize时候,相当于文件已经下完了。。。呵呵,个人见解。
不知道你有没有研究过golang里处理epoll的等效方案?是否可以分享一下思路?
关注你blog很久了,今天终于现场听到分享了,很棒啊
range 只是为了确认发送的字节是哪个区间的,具体发送了多少要看 send 的返回值。
有不少 client 是直接问 start- 而不是 start-end 的, 下载工具取够自己需要的字节数就断开连接. range 头是不足够可信的.

Post a comment

非这个主题相关的留言请到:留言本