Results matching “mobile”

iPad的视频播放

前一阵下载了一个电影,兴冲冲的使用高清播放器播放时发现mkv封装不认,无法播放,然后用PI进行播放,但看一会播放器就死掉,没辙了,但LP急于要看,所以临时用iPad播放HDMI输出到电视。

本来以为New iPad播放720p应该完全没有问题,因为之前看1080p的视频也看过不少,觉得还行,但HDMI输出到电视后,发现卡顿现象很严重,所以又开始了一番学习。

当晚就折腾了好几个播放器,当然必须支持AC3,但后来网上看到第三方播放器因为无法使用GPU硬解功能,所以播放高码率的骗子肯定会有问题的,推荐的还是越狱后的xbmc,立马安装测试。

弄好之后又开始想以后如何播放呢?每次从电脑copy到iPad上实在太麻烦,所以必须得网络播放啊,这时候新入的WNDR3700派上用场了,最好用的当然是samba,不过xmbc的smb服务的添加需要小心:不要自己浏览添加,手工输入,并且要到共享目录的下一层(血泪教训),不然没法添加播放的。

具体怎么说呢?

我的WNRR3700共享目录: \\10.0.0.1\USB_Storage
这样添加后没法访问的,需要到下一级目录,在SD卡上建立一个Movie目录,这样共享就是:\\10.0.0.1\USB_Storage\Movie

这个小小的问题折腾我几个小时,中途我还删除一次XBMC,家里的网络重新安装一次竟然要1个多小时(才50M,再次诅咒垃圾天威的网络,还升级到4M呢,艹你大爷,慢的要死),还不如我使用移动的TD网络下载快。

已经添加的目录怎么删除呢?。。。
双指双击,就会弹出对话框了。
参考:
http://bbs.weiphone.com/read-htm-tid-2645013.html
http://bbs.weiphone.com/read-htm-tid-2542996.html

配置文件删除:/var/mobile/Library/Preferences/xbmc


smb问题:
http://forum.xbmc.org/showthread.php?tid=127041

When you're adding the source, choose "Add network location" from the list in the Browse dialog, then manually type in the server and share name. This will create a network location called something like smb://server/share/. Select this location from the list to create your source.

Try adding your pc name(for ex. //Office-pc/ or //Johns-pc) and not the IP. That's what I did and it worked.


http://forum.xbmc.org/showthread.php?tid=109936

Try adding the source in a different way. When you click the Browse button choose "Add network location" instead of "SMB" (you need to scroll the list down to see this option). Enter the server and share name and user details if you need them, then when you click OK the source should appear in the list as smb://server/share. Select this source, click OK and that should work.

2011-09-13 09:47 Post: #4
When you try and view the members of a SMB workgroup a protocol called "browsing" is used. This has been used since the early days of Microsoft Networking back in the Windows for Workgroups days (actually I think MS Lan Manager used it too). It was unreliable then and hasn't got any better since.

That's a bit unfair, since browsing generally works fine, but there are many cases where it can stop working and you get the sort of symptoms you see. Adding the network location by hand bypasses browsing, though of course you need to know the server and share names.

--EOF--

goagent小试

因为一直都使用ssh来进行必要时的访问,所以最近几年都没怎么折腾翻墙的事情。今天在同学的群里听说goagent还不错,恰好下午很早回家,也就折腾了一下,感觉非常好!

参考信息:
https://code.google.com/p/goagent/ 这里的内容多看看基本够了。
在笔记本上也都装了,后续确实可以很方便的直接使用了,而且速度也非常不错。

接下来就是还想让手机也能用上,参考:
https://code.google.com/p/goagent/wiki/GoAgent_IOS,可惜没一次搞定,再找:
http://ifan.178.com/thread-1387056-1-1.html
http://www.i7086.com/goagentwufafangwendejiejue/comment-page-2
多看看,要点:
1)Cydia开发者模式
2)安装Python,goagent-toggle(sbsettings开关), goagent-local
3)安装证书,使用Safari安装,iFile怎么安装我没学会
4)如果访问异常,注意修改proxy.ini中的cn->hk https等信息
5)pac文件注意:打开设置- WiFi(国行叫无线局域网)-点击您热点右侧的箭头-拖到最下方"http代理" 选择自动然后输入"
file://localhost/var/mobile/goagent-local/8087.pac"或"file://localhost/var/stash/Applications/MobileSafari.app/8087.pac"(需要将8087.pac从var/mobile/goagent-local/ 移到Applications/MobileSafari.app/ 下 )(利用pac翻比全局好),用后面的这个路径。


--EOF--

物尽其用:让iPhone通过ssh上网

1.安装openssh,mobile terminal
2.笔记本也可以ssh上去root/mobile 默认密码都是alpine,记得passwd修改哦
3.其它信息,折腾暂未成功,参考的资料信息:

http://qiong.info/archives/6130
iphone使用ssh来匿名代理上网


http://todaym.com/2010/05/iphone-over-the-wall-via-ssh-pac.html
http://todaym.com/2010/05/iphone-ipod-touch-mac-ssh-connection-automatic-login.html

http://wangheng.org/configure-gcc-on-ipad2.html
为ipad2安装和配置gcc编译环境


另外,今天发现的便宜的VPS:
http://www.123systems.net/index.html

--EOF--

广东免费WIFI WLAN亚运期间免费使用

为了迎接即将到来的亚运盛事,在11月和12月期间,作为亚运高级合作伙伴的广东移动将会为广大市民提供免费WLAN上网业务,市民和游客只需到广东移动WLAN热点所覆盖的区域即可免费享用无线上网。

(亚运期间免费)短信方式:

办理:发送KTWLAN发送至10086(深圳客户编写短息"SQWLAN"发送到10086开通业务)

取消:发送QXWLAN至10086

修改WLAN密码:发送XGWLANMM#原密码#新密码至10086

重置WLAN密码:发送CZWLANMM至10086

帮助:发送HWLAN至10086
WAP方式:wap.gd.10086.cn


http://221.179.9.18:8080/bpss/jsp/intro_Wlan.jsp

亚运期间,WLAN上网全程免费啦!广东省内外的中国移动客户、国际漫游来访客户在广东省移动WLAN覆盖区域内均可享用免费WLAN服务!
服务时间:2010年11月1日-2010年12月31日

服务对象:中国移动客户、国际漫游来访客户、中国联通和中国电信客户(仅限广州市移动WLAN覆盖区域)

服务范围:广东省内所有WLAN热点区域
中国移动广东公司客户如何使用?
广东省内客户无需申请,使用原手机号码和密码登录即可享受免费WLAN服务。
中国移动非广东公司客户如何使用?
·中国移动非广东公司客户使用移动手机号可申请一个免费账号使用WLAN服务;
·每个手机号码只绑定一个免费账号;
·客户申请的免费帐号仅在活动期间有效。
注:中国移动非广东公司客户只能通过免费帐号方式享受免费WLAN服务,若使用原手机号码登录会产生WLAN服务费用;
中国联通、中国电信客户如何使用? (仅限广州市内移动WLAN覆盖区域)
·中国联通、中国电信客户,可申请免费账号,在广州市内移动WLAN覆盖区域免费使用WLAN服务;
·每个手机号码只绑定一个免费账号;
·客户申请的免费帐号仅在活动期间有效。
How to use the WLAN(Wi-Fi) service? 国际漫游来访客户如何使用?
During the 16th Asian Games (from 1st November 2010 to 31st December 2010),International roaming visitors can enjoy free
WLAN(Wi-Fi) service in Guangdong province. You can login the WLAN service with your mobile number and free WLAN password.
Free WLAN service is only available when the user registers onto CMCC mobile network.
Phone number: e.g. the area code is "1" and the mobile number is "325370xxxx", the phone number shall be "001325370xxxx". (Note: "00" is required)
Free WLAN(Wi-Fi) Password: Select CMCC mobile network and send *139# on the mobile phone to obtain the free WLAN
password.(type *139# on your mobile phone and press the call button)
·国际漫游来访客户使用原手机号码和免费密码登录,即可免费使用WLAN。
·关于手机号码:如,美国用户的手机号为325-370-XXXX,美国的国际区号为001,则登录WLAN时应使用"001325370xxxx"作为登录账号
 登录,必须以"00"开头;
·关于免费密码:客户入境时选择中国移动网络漫游,发送*139#申请免费密码(在手机键盘键入 *139# 后按通话键)。
·中国移动免费WLAN服务仅在客户登记在中国移动网络时有效


WLAN办理方式
    使用WLAN上网需通过WLAN登陆界面验证(包括免费热点),验证需要提供WLAN帐号及登陆密码,WLAN账号为用户的手机号码,登陆密码可以是业务密码或动态密码。系统验证方式为:手机号码+业务密码或手机号码+动态密码。动态密码在WLAN认证界面选择动态密码方式,点击"获取动态密码"获取。业务密码在客户开通WLAN业务时获取,客户可通过发送短信或拨打10086等方式开通WLAN。 

业务密码申请方式
1、短信方式
1)申请密码:编写短信"KTWLAN"发送至10086。

2)修改密码:编写短信"XGWLANMM□原密码□新密码"发送至10086。(密码区分大小写,长度为6,□表示空格)。

3)重置密码:编写短信"CZWLANMM"发送至10086。

以申请密码为例,发送短信"KTWLAN"到10086,业务密码以短信形式下发至用户手机。

注:以上拼音字母大小写均可,发送到10086的短信免费。

2、10086方式
用户拨打归属地的10086申请WLAN上网密码,密码以短信形式下发给用户手机。


WLAN套餐办理
在未办理WLAN套餐的情况下,使用WLAN上网按照实际上网时长收费,全国统一标准资费为0.05元/分钟,计费时长按分钟取整。除正常资费外,客户可以选择办理WLAN套餐,超出套餐部分均按0.05元/分钟计费。办理WLAN套餐前须先开通WLAN功能,发送KTWLAN到10086申请。选择办理WLAN套餐,超出套餐部分均按0.05元/分钟计费。办理WLAN套餐前须先开通WLAN功能,发送KTWLAN到10086申请。

WLAN套餐资费:(全国统一套餐资费)
仅面向中国移动客户开放,客户名为中国移动手机号码。
月基本费 包含WLAN时长 超过套餐后的WLAN资费 备注
30元 15小时/月 0.05/分钟 可全国漫游使用
50元 40小时/月
100元 200小时/月
套餐办理方式
1)30元套餐: 编写短信"KTWLAN15"发送至10086。
2)50元套餐: 编写短信"KTWLAN40"发送至10086。
3)100元套餐: 编写短信"KTWLAN200"发送至10086。
套餐办理方式
已办理30元套餐的客户,如需变更为50元套餐,则直接发送KTWLAN40到10086即可将30元套餐变更为50元套餐,其它套餐依次类推。
套餐取消方式
取消WLAN套餐,统一编写短信"QXWLAN"发送至10086
套餐生效规则
1)全球通、随e行和3G客户当月办理开通,24小时内生效。本月变更或取消WLAN套餐,次月1日生效。
2)动感地带和神州行客户办理WLAN套餐24小时内生效;套餐变更和取消下个月结日生效。


注:以上拼音字母大小写均可,发送到10086的短信免费。


--EOF--

使用移动3G TD无限流量卡 上网,最近经常发现非常慢,上香港的几个财经网站老是打不开网页,我上BBS Telnet确实非常顺畅的。
今天心有不甘,想起我上BBS都是直接指定IP地址的,不需要DNS解析,会不会是移动的DNS的问题呢?

在Mobile Partner中找到了连接的选项:工具-》选项-》连接配置管理-》高级 即可查看DNS的设置。
把DSN设置为静态,填上8.8.8.8 和 8.8.4.4 两个,再上网,抽风的症状没有了,真怀疑是移动的DNS服务本身的问题呢,还是移动故意的?

C:\Documents and Settings\Administrator>ping 8.8.8.8

Pinging 8.8.8.8 with 32 bytes of data:

Reply from 8.8.8.8: bytes=32 time=141ms TTL=50
Reply from 8.8.8.8: bytes=32 time=140ms TTL=50
Reply from 8.8.8.8: bytes=32 time=139ms TTL=50
Reply from 8.8.8.8: bytes=32 time=138ms TTL=50

Ping statistics for 8.8.8.8:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 138ms, Maximum = 141ms, Average = 139ms

C:\Documents and Settings\Administrator>ping 8.8.4.4

Pinging 8.8.4.4 with 32 bytes of data:

Reply from 8.8.4.4: bytes=32 time=134ms TTL=50
Reply from 8.8.4.4: bytes=32 time=139ms TTL=50
Reply from 8.8.4.4: bytes=32 time=244ms TTL=50
Reply from 8.8.4.4: bytes=32 time=133ms TTL=50

Ping statistics for 8.8.4.4:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 133ms, Maximum = 244ms, Average = 162ms

再来看看移动的DSN的情况,居然比Google的还慢!!!

PPP adapter cmnet:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
        Physical Address. . . . . . . . . : 00-53-45-00-00-00
        Dhcp Enabled. . . . . . . . . . . : No
        IP Address. . . . . . . . . . . . : 10.141.198.3
        Subnet Mask . . . . . . . . . . . : 255.255.255.255
        Default Gateway . . . . . . . . . : 10.141.198.3
        DNS Servers . . . . . . . . . . . : 211.136.20.203
                                            211.136.20.203
        NetBIOS over Tcpip. . . . . . . . : Disabled

C:\Documents and Settings\Administrator>ping 211.136.20.203

Pinging 211.136.20.203 with 32 bytes of data:

Reply from 211.136.20.203: bytes=32 time=156ms TTL=247
Reply from 211.136.20.203: bytes=32 time=120ms TTL=247
Reply from 211.136.20.203: bytes=32 time=124ms TTL=247
Reply from 211.136.20.203: bytes=32 time=113ms TTL=247

Ping statistics for 211.136.20.203:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 113ms, Maximum = 156ms, Average = 128ms

--EOF--

IB 可以卖空的港股列表

http://www.interactivebrokers.com.hk/en/trading/ViewShortableStocks.php?cntry=hongkong&tag=Hong%20Kong&ib_entity=cn&ln=

 

Last updated:Wed, 10.Feb.10 00:38HKT
Symbol Currency Long Name  
1 HKD Cheung Kong Holdings Ltd Check Availability
101 HKD Hang Lung Properties Ltd Check Availability
1088 HKD China Shenhua Energy Co Ltd Check Availability
11 HKD Hang Seng Bank Ltd Check Availability
1199 HKD COSCO Pacific Ltd Check Availability
12 HKD Henderson Land Development Co Ltd Check Availability
13 HKD Hutchison Whampoa Ltd Check Availability
1398 HKD Industrial & Commercial Bank of China Check Availability
144 HKD China Merchants Holdings International Co Ltd Check Availability
16 HKD Sun Hung Kai Properties Ltd Check Availability
17 HKD New World Development Ltd Check Availability
19 HKD Swire Pacific Ltd Check Availability
2 HKD CLP Holdings Ltd Check Availability
2038 HKD Foxconn International Holdings Ltd Check Availability
23 HKD Bank of East Asia Ltd Check Availability
2318 HKD Ping An Insurance Group Co of China Ltd Check Availability
2388 HKD BOC Hong Kong Holdings Ltd Check Availability
2600 HKD Aluminum Corp of China Ltd Check Availability
2628 HKD China Life Insurance Co Ltd Check Availability
267 HKD Citic Pacific Ltd Check Availability
291 HKD China Resources Enterprise Check Availability
293 HKD Cathay Pacific Airways Ltd Check Availability
3 HKD Hong Kong & China Gas Co Ltd Check Availability
330 HKD Esprit Holdings Ltd Check Availability
3328 HKD Bank of Communications Co Ltd Check Availability
386 HKD China Petroleum & Chemical Corp Check Availability
388 HKD Hong Kong Exchanges and Clearing Ltd Check Availability
3988 HKD Bank of China Ltd Check Availability
4 HKD Wharf Holdings Ltd Check Availability
494 HKD Li & Fung Ltd Check Availability
6 HKD HongKong Electric Holdings Check Availability
66 HKD MTR Corp Check Availability
762 HKD China Unicom Hong Kong Ltd Check Availability
83 HKD Sino Land Co Check Availability
836 HKD China Resources Power Holdings Co Ltd Check Availability
857 HKD PetroChina Co Ltd Check Availability
883 HKD CNOOC Ltd Check Availability
939 HKD China Construction Bank Corp Check Availability
941 HKD China Mobile Ltd Check Availability

--EOF--

广东汕尾移动的相关优惠活动

下面的活动参加了充值50送10的,活动结束后还应该送5元话费;

139.com的活动在1月我有登录2次,2月也已经有登录2次,那我应该有2个5元赠送话费的;

参加了充值100送30的活动,已经成功登记:


号码: 10086
内容:
尊敬的客户:您已成功登记参与"充100元送30元"优惠活动,我司完成数据核对后将为您赠送30元话费,获赠的话费从次月起分3个月平均返回,感谢您的参与。彩铃客户还可获赠9元彩铃包优惠,活动详情请回复208,中国移动
时间: 2010-02-06 01:32:57

 

http://www.gd.chinamobile.com/10086/help/payment/01,13276.shtml

10、神州行成功充值后,是否会增加相应的有效期?
答:会的。
  成功充值10元,会增加15天的有效期
  成功充值30元,会增加90天的有效期;
  成功充值50元,会增加90天的有效期;
  成功充值100元,会增加180天的有效期;
  成功充值300元,会增加360天的有效期;
  成功充值500元,会增加360天的有效期。
  神州行充值金额上限是5000元,话费最长有效期是2年,即有效期达到2年时,如继续充值将不再延长话费有效期
 

在充值页面的优惠提示:

2008年3月1日至2010年12月31日,通过本网站充值以下金额将可获得话费赠送: 充值50元送1元、充值100元送3元、充值300元送10元。如需办理各类预存、充值营销案,请登陆"优惠活动办理"。

另外:

31日前全品牌客户一次性充50元送10元,获赠话费立即到帐,不限参与次数。2月28日前动感、神州行客户在本界面一次性充100元,并发送CZ到10086登记可获赠30元,获赠话费从次月起分3个月返回,每月返回10元,每客户限参加一次。如办理动感、神州行充300送150积分,请登陆"优惠活动办理"。

这2个是可以叠加的!

 

http://www.gd.chinamobile.com/shanwei/discount/brand/01,19669.shtml
e100网上充值,送话费越充越值
2010年02月02日 09:22
一、活动时间:
     2010年2月3日-3月31日
 二、适用人群:
     汕尾移动全品牌客户
 三、活动内容:
     活动期间通过网上服务厅进行充值,一次性充50元送10元,赠送话费立即到帐并进入赠送账户,不限参与次数(仅限状态为正使用的客户参与,欠费或停机的号码须先缴清欠费,才可参与此优惠)。
     凡成功参与充值优惠的客户,在活动期间登陆网上服务厅查询或办理任何业务即可额外再获赠5元话费(每号码仅限一次),于活动结束后十五天内到帐。


http://www.gd.chinamobile.com/shanwei/discount/brand/01,19533.shtml
五虎呈祥闹新春,百万话费大抽奖 2010年01月21日 15:11
一、活动时间:
     2010年1月20日-2月28日
二、适用人群:
     活动期间新入网客户、139说客活跃客户
三、活动内容:
 1、新入网,百万话费大抽奖
     活动期间,新入网客户发送短信"CJ"到1008600988参加活动,系统将按客户上行信息的顺序进行编号,并自动下发序列号,序列号为30倍数的客户可获得100元话费大奖,序列号为300倍数的客户可获得1000元话费大奖。每位客户仅可参与一次活动,话费奖励以高的额度为准,客户获赠的话费将在2010年3月份起分十个月等额返还。
 2、登139说客,百万话费大抽奖
     活动期间,汕尾地区所有移动客户通过电脑或手机登陆网站www.139.com,注册成为139说客客户(已注册客户可直接登陆使用),并在当月登陆使用两次以上,成为139说客活跃客户,即可于次月获赠5元话费。且活动设置幸运大抽奖,活动期间139说客活跃客户均可获得一次幸运抽奖机会。抽奖将在活动结束后在公证处的监督下统一进行,中奖客户获赠的话费将在2010年3月份起分十个月等额返还。
     活动奖项(全市奖项):设置1000元话费大奖100名,100元话费大奖1000名。

 

--EOF--

http://dev.kcn.cn/

0. 序
  0.0 声明
  0.1 本文说明
1. 版面及文章
  1.1 文章的存储
  1.2 版面文章索引,fileheader 结构
  1.3 id, groupid, reid 三个字段
  1.4 附件结构
  1.5 .BOARDS 文件,boardheader 结构
2. 用户
  2.1 什么样的 ID 在 kbs 系统中是合法的
  2.2 用户相关的文件系统结构
  2.3 userec 结构
  2.4 userdata 结构
  2.5 密码
  2.6 用户 home 目录下面其它一些文件的说明
    2.6.1 .boardrc.gz 已读记录
    2.6.2 favboard 收藏版面
    2.6.3 friends 好友列表
    2.6.4 plans 个人说明档
    2.6.5 signatures 签名档
3. 用户站内信件
  3.1 信件目录及数据结构
  3.2 自定义信箱
  3.3 信箱属性
4. 共享内存结构
  4.1 publicshm 共享内存结构 public_data
  4.2 uidshm 用户信息共享内存结构 UCACHE
    4.2.1 UCACHE 内 hash 表结构
  4.3 utmpshm 登录状态信息 UTMPFILE
  4.4 utmphead 登录表共享内存结构 UTMPHEAD
  4.5 wwwguest_shm:wwwguest 在线用户表结构 WWW_GUEST_TABLE
  4.6 bcache,brdshm:版面状态共享内存结构 BCACHE
5. 代码结构


$Id: kbsIntro.txt 10425 2008-10-24 15:45:35Z fancy $

发信人: atppp
标  题: [kbsIntro] kbs 系统入门
发信站: http://dev.kcn.cn/

0. 序  [ 回目录 ]

0.0 声明  [ 回目录 ]

尽管 kbs 系统基础数据结构一般很少变化,但是本文档只针对 kbs SVN 主分支目前的代码,不保证对其它时间或其它分支代码的正确性,也不对可能造成的任何后果负责。本文可以在网络上自由转载,但请保留全文的完整性。

0.1 本文说明  [ 回目录 ]

文中有一些对数据结构的说明。大多数结构定义在 src/struct.h 中,char[] 的字段若非特别说明都是以 '\0' 结束的字符串。对本文或相关问题的疑问,欢迎到水木社区 (newsmth.net) BBSMan_Dev 版讨论。

 

1. 版面及文章  [ 回目录 ]

1.1 文章的存储  [ 回目录 ]

每个版面都是一个目录。比如 SYSOP 版的目录是 $BBSHOME/boards/SYSOP/。在这个目录下面有这个版面的文章及索引,每一篇文章都是一个文件,文件名大致是这样子:

M.1085385291.w0
             ^^ 用于区分同一个时间点的多个帖子
  ^^^^^^^^^^ 10 位数的 timestamp,帖子发表时间
^ M 是文件名前缀,不同性质的文件,前缀就不一样

下面是各版面索引文件和相应文件名的前缀:(通常情况下)
版面文章   .DIR        M
置顶文章   .DINGDIR    Z (硬连接到相应 M 前缀文件)
文摘区     .DIGEST     G (硬连接到相应 M 前缀文件)
回收站     .DELETED    D
废纸篓     .JUNK       J

同主题模式依赖于版面目录下面的一个 .ORIGIN 文件。这个文件就是 .DIR 文件里面所有原作(id==groupid,参考 1.3 节)的 fileheaders。

另外,在 $BBSHOME/vote/ 下面每个版面也会有一个目录,主要用于储存投票等数据,按照 KCN 的精神,今后最好不要再在 vote 目录下储存版面信息。


1.2 版面文章索引,fileheader 结构  [ 回目录 ]

每个索引文件就是多个 fileheader 结构。这个 fileheader 定义在 src/default.h 或者 src/site.h 里面,具体解释如下:

typedef struct fileheader {
    char filename[FILENAME_LEN];
        帖子的文件名,比方 1.1 节那个例子,这个字段就是 M.1085385291.w0。
        kbs 也可以采用版面目录下 52 个子目录分散储存帖子的方法(参考
        feeling.h 内 GET_POSTFILENAME 宏定义),这种情况下,本字段的形式
        就是 A/M.1085385291.w0。
    unsigned int id, groupid, reid;
        这三个 id 字段非常重要,下面一节具体说明。
    int o_bid;
    unsigned int o_id;
    unsigned int o_groupid;
    unsigned int o_reid;
        以上四个字段用于需审核的文章和推荐文章,o_bid 是原文的版面 bid。
        后面三个是原文在原版面 .DIR 中相应的三个 id 字段值。
    char innflag[2];
        帖子是否转信。"LL" 表示本地发表,"SS" 表示转信,"\0M" 表示外面
        转进来的文章。
    char owner[OWNER_LEN];
        发文作者。
    unsigned int eff_size;
        帖子的有效字节数。
    time_t posttime;
        帖子发表时间的 timestamp。在使用 52 个子目录分散储存帖子的情况下该
        字段尤其重要。
    long attachment;
        附件位置偏移量,参考下面的附件格式。
    char title[ARTICLE_TITLE_LEN];
        帖子的标题。注意超长标题需要截短。
    unsigned short replycount;
        主题帖的回复数,在 .DIR 和 .ORIGIN 中同步更新,对于其他模式和非主题
        贴,该字段无用。
    char unused[114];
        没有用到,为了将来需要升级该结构体时省却转换索引的麻烦,所以留点地方。
    unsigned char accessed[4];
        一些帖子的属性,前两个元素是 bitwise-OR 的属性,包括:
        accessed[0]: FILE_SIGN     (0x01) 版主设置的 # 标记
                     FILE_TOTAL    (0x02) 已被制作合集
                     FILE_PERCENT  (0x04) 版主设置的 % 标记
                     FILE_MARKED   (0x08) 被 m 的帖子
                     FILE_DIGEST   (0x10) 文摘区贴子(被 g 的帖子)
                     FILE_IMPORTED (0x80) 已被收录精华
        accessed[1]: FILE_READ     (0x01) 不可 re
                     FILE_DEL      (0x02) 版主标记删除 X
                     FILE_MAILBACK (0x04) 回帖抄送信箱
                     FILE_COMMEND  (0x08) 已被推荐文章
                     FILE_CENSOR   (0x20) FILTER 版面需审核文章
                     FILE_TEX      (0x80) tex 方式发表帖子
        accessed[3]: 回收站的 .DIR 中这个字段为:
                     删除时间 timestamp / (3600 * 24) % 100
                     主要用于定时删除老的删帖。
} fileheader;


1.3 id, groupid, reid 三个字段  [ 回目录 ]

这三个字段是帖子的索引 ID 和同主题信息。.DIR 里面 fileheader 结构的 id 字段依次递增。注意一定是递增,否则 web 下浏览会不正常!另外两个字段的作用举例如下:

有人新发表了帖子 A,这个帖子系统自动给了 id = 10
然后有人回复帖子 A,我们叫它帖子 B;
再有人回复了帖子 B,我们叫它帖子 C;
最后有人回复帖子 A,称为帖子 D。这四个帖子的三个字段会是这样:

帖子    id      groupid     reid
================================
 A      10      10          10
 B      11      10          10
 C      12      10          11
 D      13      10          10

其中,groupid 就是用来判断帖子同主题的,注意,帖子同主题和帖子标题无关。reid 用来产生回复树结构。


1.4 附件结构  [ 回目录 ]

附件的内容就添加在它所属帖子的那个文件的末尾。有附件的帖子文件其组成是:帖子正文(最后是一个回车符),附件一,附件二,...其中每个附件段是由四个部分组成的:
*) 第一部分:八个 '\0' 字节。
*) 第二部分:附件的原始文件名字符串,可以含有中文字符,长度不应该超过 40 个字
   符。文件名的后缀将决定附件类型。本部分长度不定,所以千万不要忘记最后的 '\0'
   字符串结束符。
*) 第三部分:四个字节,unsigned int 二进制格式整数,表示本附件的长度;
   注意这个整数是网络字节序(big-endian)存储,也即 MSB 在先。
*) 第四部分:二进制格式储存的这个附件,本部分长度由第三部分决定。
另外,这个帖子在 .DIR 里面相应的那个 fileheader 结构的 attachment 字段应该设置为第一个附件段的起始偏移量(ftell)。参考:
libBBS/article.c upload_post_append() 和 get_mimetype() 函数


1.5 .BOARDS 文件,boardheader 结构  [ 回目录 ]

$BBSHOME/.BOARDS 文件是所有版面的信息,实际上是 MAXBOARD 个 boardheader 结构。在 kbs 系统内部每个版面都有一个版面号 bid,这个 bid 就是该版面在 .BOARDS 里面的位置,注意版面号是 1-based 的。

struct boardheader {
    char filename[STRLEN];
            版面的英文名称,STRLEN 是 80
    char BM[BM_LEN];
            版主列表,BM_LEN 是 60。多个版主用空格隔开
    char title[STRLEN];
            版面的说明,格式是 a[bbbb]ccccccdddd...
                a: 讨论区分区
                bbbb: 讨论区分类
                cccccc: 转信标签,一般设置为六个空格
                dddd....: 讨论区说明,也即通常所说的版面中文名称
            比方:
                0[站务]      测试用版
    unsigned level;
            版面存取权限。
    unsigned int idseq;
            当前已经使用到的 id 值,参考 boardstatus 结构 nowid 字段。
    unsigned int clubnum;
            俱乐部序号。0 表示这个版面不是俱乐部。
    unsigned int flag;
            版面的一些属性比方是否参与转信。
    union {
    unsigned int adv_club;
    unsigned int group_total;
    } board_data;
    time_t createtime;
            版面创建时间,"新开启的讨论区"会用到。
    int unused;
    char ann_path[128];
            精华区路径。实际精华区绝对路径是:
            $BBSHOME/0Announce/groups/<ann_path>
    int group;
            所属目录。
    char title_level;
            设定用户需要什么身份可见这个版面。0 表示没有限制。
    char des[195];
            版面描述,用于 www 的版面说明和版面超级搜索。
#ifdef FLOWBANNER
    int bannercount;
    char banners[MAXBANNER][BANNERSIZE];
#endif
};

 

2. 用户  [ 回目录 ]

2.1 什么样的 ID 在 kbs 系统中是合法的  [ 回目录 ]

kbs 系统合法 ID 的规则是:至少 2 个字符,至多 12 个字符。第一个字符必须是字母,后面的字符必须是字母或者数字。


2.2 用户相关的文件系统结构  [ 回目录 ]

$BBSHOME/.PASSWDS 是用户帐号基本信息,实质上是 MAXUSERS 个 userec 结构,结构说明后面详细写。另外,每个用户还有一个 home 目录和一个信件目录,比方 atppp 用户这两个目录分别是 $BBSHOME/home/A/atppp/ 和 $BBSHOME/mail/A/atppp/。用户 home 目录下有一些杂七杂八的文件,其中有一个文件叫做 .userdata,这个是用户帐号的补充信息,实际上就是一个 userdata 结构,结构说明后面详细写。信件目录到后面一大章节再说。


2.3 userec 结构  [ 回目录 ]

struct userec {
    char userid[IDLEN + 2];
        用户名。IDLEN 是 12,不要轻易修改。
    char flags;
        一些标志,戒网,版面排序之类的。转换用户建议设置成 0x81,也就是
            PAGER_FLAG | CURSOR_FLAG
        参考源代码 contrib/fb2k2smth/README 相关说明。
            #define PAGER_FLAG   0x1        /* true if pager was OFF last session */
            #define CLOAK_FLAG   0x2        /* true if cloak was ON last session */
            #define BRDSORT_FLAG 0x20       /* true if the boards sorted alphabetical */
            #define CURSOR_FLAG  0x80       /* true if the cursor mode open */
            #define GIVEUP_FLAG  0x4        /* true if the user is giving up  by bad 2002.7.6 */
            #define PCORP_FLAG   0x40       /* true if have personalcorp */
    unsigned char title;
        用户身份
    time_t firstlogin;
        注册时间或者第一次登录的时间戳。
    char lasthost[16];
        最后登录的 IP。
    unsigned int numlogins;
        登录次数。
    unsigned int numposts;
        发帖数。
#ifdef CONV_PASS
    char passwd[OLDPASSLEN];
    char unused_padding[2];
#endif
    char username[NAMELEN];
        用户昵称。
    unsigned int club_read_rights[MAXCLUB>>5];
    unsigned int club_write_rights[MAXCLUB>>5];
        这两个是俱乐部读写权限。如果该用户的
            club_read_rights[(clubnum-1)>>5]&(1<<((clubnum-1)&0x1f))
        为真,则这个用户可以读取俱乐部号为 clubnum 的版面。参考函数
            check_read_perm() haspostperm()
        注:这里的数据结构决定了 MAXCLUB 必须定义为 32 的倍数。
    unsigned char md5passwd[MD5PASSLEN];
        md5 消化过的密码。密码问题后面会一并详细说明。
        此字符串定长 16,最后不以 '\0' 结束!
    unsigned userlevel;
        用户权限。
    time_t lastlogin;
        上次登录的时间戳。
    time_t stay;
        总上线时间。单位是秒。
    int signature;
        当前使用的签名档号码。
    unsigned int userdefine[2];
        用户自定义参数。新注册用户是 0xffffffff,但是 wForum 的标准应该是默认
        关闭公布详细信息,userdefine[0] 的实际初始值是
            0xFFFFFFFF & (~DEF_SHOWREALUSERDATA)
        也就是 0xBFFFFFFF。
    time_t notedate;
    int noteline;
        上面两个都和查看留言板相关。
    int unused_atppp;
    time_t exittime;
        上次退出登录的时间戳。
    unsigned int usedspace;
        用户信件使用的磁盘空间。
    int unused[7];
};

2.4 userdata 结构  [ 回目录 ]

userdata 是用户 home 目录下 .userdata 文件的结构。另外用户 home 目录下还有一个文件是 usermemo(用来 mmap 的),这个文件的内容要和 .userdata 严格一致,如果 usermemo 文件不存在系统会自动从 .userdata 建立,所以如果 usermemo 存在且和 .userdata 不一致的话系统就会出错。

userdata 结构:

struct userdata
{
    char userid[IDLEN + 2];
        用户名。
    char __reserved[2];
    char realemail[STRLEN - 16];
        真实 email。
    char realname[NAMELEN];
        真实姓名。
    char address[STRLEN];
        通讯地址。
    char email[STRLEN];
        email。
#ifdef HAVE_BIRTHDAY
    char            gender;
        性别,写 'M' 或者 'F'。如果不是这两个字符可能出错。
    unsigned char   birthyear;
        出生年的后两位。
    unsigned char   birthmonth;
        出生月。
    unsigned char   birthday;
        出生日。上面三个字段注意类型是 unsigned char。
#endif
    char reg_email[STRLEN];
        注册使用的 email。
/*#ifdef SMS_SUPPORT*/
    bool mobileregistered;
    char mobilenumber[MOBILE_NUMBER_LEN];
/*#endif*/
/* add by roy 2003.07.23 for wForum */
    char OICQ[STRLEN];
    char ICQ[STRLEN];
    char MSN[STRLEN];
    char homepage[STRLEN];
    int userface_img;
        设置成 0。如果有自定义头像,设置成 -1。
    char userface_url[STRLEN];
        这个是自定义头像的完整 URL 地址。
    unsigned char userface_width;
    unsigned char userface_height;
        上面两个字段是自定义头像的长和宽。必须是 0~120 之间的整数。
    unsigned int group;
    char country[STRLEN];
    char province[STRLEN];
    char city[STRLEN];
    unsigned char shengxiao;
    unsigned char bloodtype;
    unsigned char religion;
    unsigned char profession;
    unsigned char married;
    unsigned char education;
    char graduateschool[STRLEN];
    unsigned char character;
    char photo_url[STRLEN];
        个人相片的完整 URL 地址。
    char telephone[STRLEN];
    char smsprefix[41];
    char smsend[41];
    unsigned int smsdef;
        上面这堆 "add by roy" 的东西目前只在 wForum 里面用到。
    int signum;
        签名档个数。
    int this_field_is_reserved_by_atppp;
    time_t lastinvite;
};

2.5 密码  [ 回目录 ]

kbs 的用户密码使用 md5 加密储存于 userec 结构的 md5passwd 字段内,但是 kbs 系统并不是对用户密码直接 md5 加密处理,md5passwd 字段是下面这四个字符串顺序连接起来的字符串的 md5:
    passmagic 密码 passmagic 用户名
其中 passmagic 是(不包括前后两个引号):
    "wwj&kcn4SMTHBBS MD5 p9w2d gen2rat8, //grin~~, 2001/5/7"
相关代码请看 libBBS/pass.c igenpass() 函数。注意 md5passwd 字段的类型是 unsigned char md5passwd[16],也就是所谓的 raw-binary format,而不是有些 md5 程序返回的 32 个字符的字符串。注:由于这个 md5passwd 消化了用户名,所以用户名更改大小写之后必须重新给该用户设置密码。


2.6 用户 home 目录下面其它一些文件的说明  [ 回目录 ]

2.6.1 .boardrc.gz 已读记录  [ 回目录 ]

用户 home 目录下面的 .boardrc.gz 存储用户的已读记录,它是一个使用 gzip 压缩的文件,解压后的长度是
    BRC_FILESIZE = MAXBOARD * BRC_MAXNUM * sizeof(unsigned int)。
BRC_MAXNUM 默认是 50,这个文件分为 MAXBOARD 段,第 i 段就是 bid = i 的那个版面的已读记录;每个版面的已读记录就是 BRC_MAXNUM 个非负整数:
    n1 n2 n3 ... np 0 ... 0
其中 n1 > n2 > n3 > ... > np > 0。这组已读记录的意义是,该版面 id > n1 的文章都是未读的,id < np 的文章都是已读的;而 np <= id <= n1 的文章中,只有
    id = n1,n2,n3,...,np
的文章才是已读的,其余全部未读。已读记录用这个方法来存储是有利有弊的,最大的好处就是比较有效的记录了用户最需要的那部分已读记录,

2.6.2 favboard 收藏版面  [ 回目录 ]

用户自定义了收藏版面之后会在用户 home 目录下创建文件 favboard。该文件的格式可以参考 libBBS/boards.c load_myboard1() save_favboard1() 函数。favboard 文件有多种允许的格式,而且 kbs 支持复杂的多目录层次收藏夹结构。下面只说明其中一种格式。favboard 文件可以是这样一个数据结构:

struct {
    int magic_version_number;
        写 0x8081
    int favbrd_list_t;
        收藏目录个数,写 1
    struct favbrd_struct fav_boards;
        具体的收藏版面
};

favbrd_struct 具体的数据结构如下:

struct favbrd_struct {
    int bnum;
        本目录中收藏版面的个数,决定下一个数组字段中多少个元素是有效的
    int bid[MAXBOARDPERDIR];
    /* bid >= 0: 版面
       bid < 0: 目录, 表示子目录是 favbrd_list[-bid]
       */
       在不涉及多层目录结构的情况下,bid[i] 表示本目录下第 i 个收藏版面,
       这里千万注意,bid[i] 是相应版面的 bid - 1,而不是 bid!也就是说,
       这里 bid[i] 是有可能为 0 的。
    char title[61];
    char ename[20];
    int father;
        根目录这个字段写 -1。
    int level;
};

另外,$BBSHOME/etc/initial_favboard 是新注册用户默认的收藏版面,格式是每行一个版名。如果该文件不存在,默认的收藏版面是 .BOARDS 文件里面的第一个版面。

2.6.3 friends 好友列表  [ 回目录 ]

这是 n 个 friends 结构的文件,每个结构都是一个好友:

struct friends {
    char id[13];
        好友 id
    char exp[LEN_FRIEND_EXP];
        好友说明,可以留空。
};

2.6.4 plans 个人说明档  [ 回目录 ]

这个没什么好说的,就是个人说明档。查询用户的时候会显示出来。

2.6.5 signatures 签名档  [ 回目录 ]

这个文件是用户签名档,每六行是一个单位,支持 ansi 控制符,wForum 额外支持少量 ubb。userdata 结构的 signum 字段存储用户签名档个数,如果出现错误可以用recalc_signum 程序来纠正。

 

3. 用户站内信件  [ 回目录 ]

用户信件,包括信件索引和具体信件内容,全部位于用户信件目录下(参考 2.2 节)。

3.1 信件目录及数据结构  [ 回目录 ]

用户信件的总体构架基本类似于讨论区文章。每封信件都是一个文件,文件名的规则和讨论区普通文章的文件名相同。索引文件除了 .DIR 还有两个,如下:

    .DIR        收件箱
    .SENT       发件箱
    .DELETED    垃圾箱

这三个索引文件的结构和讨论区文章索引 .DIR 的结构很类似,也是 n 个 fileheader 结构,少数几个字段的意义略有不同,具体解释如下:

typedef struct fileheader {
    char filename[FILENAME_LEN];
        帖子的文件名,注意第 3 个字节到第 12 个字节是帖子的发表时间戳。
    unsigned int id, groupid, reid;
    int o_bid;
    unsigned int o_id;
    unsigned int o_groupid;
    unsigned int o_reid;
    char innflag[2];
        以上八个字段没用。
    char owner[OWNER_LEN];
        对方 ID。.DIR 中表示发件人 ID,.SENT 中表示收件人 ID,.DELETED 里面
        既有可能是发件人也可能是收件人 :(
    unsigned int eff_size;
        信件大小。
    time_t posttime;
        信件发送时间的 timestamp,好像没用,除非信件也用 52 个子目录存储...
    long attachment;
        附件偏移量。
    char title[ARTICLE_TITLE_LEN];
        帖子的标题。注意超长标题需要截短。
    unsigned char accessed[4];
        一些属性,bitwise-ORs flags:
        accessed[0]: FILE_READ      (0x01) 已读
                     FILE_REPLIED   (0x20) 已回复
                     FILE_MARKED    (0x08) 被 m 的信件
                     FILE_FORWARDED (0x40) 已转发
} fileheader;

信件在索引文件中的排序没有特定的规则(并不按照时间排序)。

3.2 自定义信箱  [ 回目录 ]

kbs 系统除了上面提到的三个预定义信箱外,还支持用户自定义信箱。载入自定义信箱的代码可以参考 libBBS/record.c load_mail_list() 函数。具体来说,在用户 home 目录下有一个 maildir 文件是自定义信箱的记录,文件结构是:
struct {
    int mail_list_t;
        自定义信箱的个数
    char mail_list[MAILBOARDNUM][40];
        每个自定义信箱的具体配置,每个配置是一个 40 个字节的字符串。
        0~29 字节是信箱名称。30~39 字节是该信箱索引文件的后半段名称。
        比如,这个字符串前半段是"KCN 情书",30~39 字节是"MAILBOX1",
        那么这个自定义信箱的显示名称就是"KCN 情书",而索引文件的名称
        就是 .MAILBOX1,注意文件名第一个字符是附加上去的点。
};

3.3 信箱属性  [ 回目录 ]

在用户 home 目录下有一个文件 .mailbox.prop 是用户信箱的选项配置。该文件就是一个 int 变量,bitwise-ORs 以下属性:

#define MBP_SAVESENTMAIL      0x00000001 //发信时保存信件到发件箱
#define MBP_FORCEDELETEMAIL   0x00000002 //删除信件时不保存到垃圾箱
#define MBP_MAILBOXSHORTCUT   0x00000004
        //版面按 'v' 时进入: 收件箱(OFF) / 信箱主界面(ON)

如果用户 home 目录下 .mailbox.prop 文件不存在,系统自动使用 MBP_DEFAULT 作为信箱选项配置。

 


4. 共享内存结构  [ 回目录 ]

共享内存在 kbs 系统中主要用于进程间通信。比方,在 web 注册了之后,马上就能在 telnet 下登录了,这是因为 web 注册的那个代码修改了相应的共享内存数据,当在 telnet 试图登录的时候,代码就能在共享内存中找到这个信息。当然,这些工作完全可以用文件系统来做,但是用共享内存来做进程间通信效率就会高很多。BBS 的很多重要数据都在共享内存里面,比如两个重要的系统文件:

$BBSHOME/.PASSWDS 这个是用户的帐号信息,包括密码。
$BBSHOME/.BOARDS  所有版面的信息。

当系统正常启动之后,这两个文件的信息在共享内存里面,系统会定时写磁盘同步数据。当系统正常运行的时候,直接打开这两个文件修改是不对的!BBS 程序如有基础结构变动的更新,一般必须要停掉 BBS 服务,清除掉共享内存数据。kbs 系统使用的主要共享内存列举如下,其中标识是可以在 sysconf.ini 定义的共享内存 key,如无定义则使用默认。

程序变量          说明         要处理代码文件   标识及默认
======================================================================
bcache        .BOARDS 的 mmap     bcache.c      只是一个 mmap
brdshm        版面状态            bcache.c      BCACHE_SHMKEY   0xe6d
uidshm        用户信息            ucache.c      UCACHE_SHMKEY   0xe70
utmpshm       登录用户状态信息    utmp.c        UTMP_SHMKEY     0xe73
utmphead      登录表              utmp.c        UTMPHEAD_SHMKEY 0xe72
wwwguest_shm  wwwguest 登录信息   bbslib.c      WWWGUEST_SHMKEY 0x1194
publicshm     全局信息            stuff.c       0xe74 (*)

(*) 援引 bbs.h 注释:
#define PUBLIC_SHMKEY   3700
/*这个是唯一一个定义死的SHMKEY,因为sysconf_eval需要
public shm,而attach shm又需要sysconf_eval,ft*/


4.1 publicshm 共享内存结构 public_data  [ 回目录 ]

struct public_data {
    time_t nowtime;
        当前时间。BBS 系统有大量取当前时间的调用,全部从这里取可以提高效率。
        这个时间由 miscd 中的 timed 进程负责和系统时钟同步。从这里可以知道
        如果 timed 进程不正常的话,bbs 的时间就会停止,比方 web 登录就可能
        会提示登录过于频繁。
    int sysconfimg_version;
        当前最新 sysconf 版本号,新登录用户会读入 sysconf.img.版本号
        映像文件作为菜单。站务在主菜单按 shift+~ 会将这个字段加 1,并从
        sysconf.ini 和 menu.ini 生成新的 sysconf.img.版本号 映像文件。
        注意 web 不会自动读取新的 sysconf,如果有涉及 web 的参数修改(比方
        BLOG MYSQL 密码),必须重新启动 web。
    int www_guest_count;
        当前登录的 wwwguest 数目
    unsigned int max_user;
        系统曾经到过的最高登录人数(包括 wwwguest)
    unsigned int max_wwwguest;
        系统到最高登录人数时,wwwguest 登录的数量。
        注意这不是系统曾经到过的最高 wwwguest 登录人数。

    /* etnlegend, 2006.03.06, userscore twice sampling for high score users ... */
    unsigned int us_sample_high[8];

    unsigned int logincount;
    unsigned int logoutcount;
    uint64_t staytime;
    unsigned int wwwlogincount;
    unsigned int wwwlogoutcount;
    unsigned int wwwguestlogincount;
    unsigned int wwwguestlogoutcount;
    uint64_t wwwstaytime;
    uint64_t wwwgueststaytime;

    /* etnlegend, 2006.03.06, userscore sampling ... */
    unsigned int us_sample[32];

    /* etnlegend, 2006.05.28, 阅读十大 ... */
    unsigned int top_version;
    struct top_header{
        int bid;
        unsigned int gid;
    } top[10];

    char unused[712];
   
#ifdef FLOWBANNER
    int bannercount;
    char banners[MAXBANNER][BANNERSIZE];
#endif
   
#ifdef FB2KENDLINE
    time_t nextfreshdatetime;
    char date[60];
#endif
};

4.2 uidshm 用户信息共享内存结构 UCACHE  [ 回目录 ]

uidshm 的结构 UCACHE 定义在 ucache.c 内,相关 hash 表常量在 uhashgen.h。

struct UCACHE {
    ucache_hashtable hashtable;
    ucache_hashtable hashusage;
    int hashhead[UCACHE_HASHSIZE + 1];
    int next[MAXUSERS];
        前面四个字段和用户 hash 表相关,后面一节具体说明
    time_t uptime;
        这个好像没用
    int number;
        有效用户容量,一般应该等于 MAXUSERS
    char user_title[255][USER_TITLE_LEN]; //定义用户的身份字符串。
        用户身份,user_title[0] 是 title 为 1 的用户的身份
        信息和 $BBSHOME/etc/title 文件同步
    struct userec passwd[MAXUSERS];
        这是 .PASSWDS 文件的内容,定时和磁盘文件同步。
        一个特定用户的用户号(uid)就是该用户在 .PASSWDS 文件中的位置,
        注意 uid 是 1-based。
};

4.2.1 UCACHE 内 hash 表结构  [ 回目录 ]

参考 doc/userid 文档。每个用户的用户名都有一个 hash 值(1 ~ UCACHE_HASHSIZE 之间),后面简称用户 hash 值。hashhead 数组是 hash 表头,存放的是该 hash 值的第一个用户的 uid。如果多个用户的 hash 值相同则用 next 字段的数据构成一条链,链中下一个用户的用户号是 next[uid - 1],如果该值为 0 表示已经到链尾。例如,系统中 hash 值都是 h 的用户一共有三个,uid 分别为 uid_1 uid_2 uid_3,那么 hash 表里可能会有这样的结构:
uidshm->hashhead[h] = uid_1
uidshm->next[uid_1 - 1] = uid_2
uidshm->next[uid_2 - 1] = uid_3
uidshm->next[uid_3 - 1] = 0

另外,hashhead[0] 存储第一个空用户的 uid,便于下次分配新用户,所有的空用户 hash 值都是 0,所以也类似的通过 next 字段组成一条链。

hashtable 和 hashusage 字段和 hash 函数相关,系统初始化时从 uhashgen.dat 读入。


4.3 utmpshm 登录状态信息 UTMPFILE  [ 回目录 ]

utmpshm 的类型是 UTMPFILE 结构,用来存储登录的状态信息。注意 wwwguest 和这个结构完全没有关系。

#define USHM_SIZE       (MAXACTIVE + 10)
struct UTMPFILE {
    struct user_info uinfo[USHM_SIZE];
        登录状态信息。每个登录都有一个登录号(utmpnum),他就是该登录在
        uinfo 数组中的位置,注意 utmpnum 是 1-based。
};

uinfo 数组的每一个元素都可以用来存储一个登录的状态信息,其结构 user_info 定义:

struct user_info {              /* Structure used in UTMP file */
    int active;                 /* When allocated this field is true */
        本结构当前是否代表一个登录用户。
    int uid;                    /* Used to find user name in passwd file */
        登录用户的 uid。
    int pid;                    /* kill() to notify user of talk request */
        telnet 登录表示其进程号。www 登录设置为 1。
    int invisible;              /* Used by cloaking function in Xyz menu */
        是否隐身。
    int sockactive;             /* Used to coordinate talk requests */
    int sockaddr;               /* ... */
    int destuid;                /* talk uses this to identify who called */
    int mode;                   /* UL/DL, Talk Mode, Chat Mode, ... */
        状态,应该赋值为 modes.h 里面的常数。
    int pager;                  /* pager toggle, true, or false */
        呼叫器状态,bitwise-OR 以下属性
            ALL_PAGER       0x1
            FRIEND_PAGER    0x2
            ALLMSG_PAGER    0x4
            FRIENDMSG_PAGER 0x8
    int in_chat;                /* for in_chat commands   */
    char chatid[16];            /* chat id, if in chat mode */
    char from[IPLEN + 4];       /* machine name the user called in from */
        登录 IP。
    time_t logintime;
        登录时间戳。
    int lastpost;
        上次发文的时间戳。
    char unused[32];
    time_t freshtime;
        上次活动的时间戳,用来计算发呆时间。
    int utmpkey;
        登录 key,用于 www cookie 验证保持用户身份。
    unsigned int mailbox_prop;  /* properties of getCurrentUser()'s mailbox */
        用户信箱选项,登录时从用户 .mailbox.prop 文件读取,参考 3.3 节
    char userid[20];
        用户名
    char realname[20];
        真实姓名,登录时从用户 userdata 结构读取
    char username[40];
        用户昵称,登录时从 uidshm 共享内存去读取,修改临时昵称就是修改这个字段
    int friendsnum;
        好友数量
    int friends_uid[MAXFRIENDS];
        每个好友的 uid,前 friendsnum 个有效。
#ifdef FRIEND_MULTI_GROUP
    unsigned int friends_p[MAXFRIENDS];
#endif
    int currentboard;
        当前所在版面的 bid 号
    unsigned int mailcheck;     /* if have new mail or new msg, stiger */
        当前登录是否有新信或新消息
};


4.4 utmphead 登录表共享内存结构 UTMPHEAD  [ 回目录 ]

utmphead 的结构是 UTMPHEAD,该结构定义在 var.h 中。注意 wwwguest 和这个结构完全没有关系。

#define UTMP_HASHSIZE  (USHM_SIZE*4)
struct UTMPHEAD {
    int next[USHM_SIZE];
    int hashhead[UTMP_HASHSIZE + 1];
    int number;
        当前登录数,注意这个数字不包括 wwwguest 数量。
    int listhead;
    int list_prev[USHM_SIZE];   /* sorted list prev ptr */
    int list_next[USHM_SIZE];   /* sorted list next ptr */
    time_t uptime;
        一个标记时间,登录 telnet 新用户时如果当前时间和这个标记时间相差
        120 秒以上,就遍历所有登录踢掉发呆时间过长的登录,同时将 uptime
        设置成当前时间。
};

utmphead 里面也有一个 hash 表,结构类似于 uidshm 里面的 hash 表。这里 hash 值是从该登录用户的 hash 值计算(参见 utmp_hash() 函数),我们把它称为 utmphash 值(1 ~ UTMP_HASHSIZE 之间)。hashhead[h] 存储的就是第一个 utmphash 值为 h 的那个登录的 utmpnum。如果多个登录有相同的 utmphash 值则用 next 字段组成一条链(utmphash 链),具体来说,如果 utmpnum 是一个 active 登录,next[utmpnum - 1] 存储该登录在这条 utmphash 链中下一个登录的 utmpnum,链尾的 next[utmpnum - 1] == 0。

所有没有登录(即 utmpshm->uinfo[utmpnum - 1].active = 0)的 utmphash 值都是 0,其中第一个 utmpnum 储存在 hashhead[0] 中,其余的通过 next 字段类似的组成一条链便于分配新登录。系统启动时没有用户登录,所以初始化为:
hashhead[0] = 1
next[0] = 2
next[1] = 3
... ...
next[USHM_SIZE - 1] = 0

utmphead 内除了 hash 表外还有一个头尾相接的环状双向链表,链表是所有 active 的登录按照登录用户名从小到大排列(case-insensitive)。listhead 是用户名最小的那个登录 utmpnum,list_prev[utmpnum - 1] 和 list_next[utmpnum - 1] 分别存储该链表中登录号为 utmpnum 的元素的前一个和后一个登录的 utmpnum。

4.5 wwwguest_shm:wwwguest 在线用户表结构 WWW_GUEST_TABLE  [ 回目录 ]

kbs 系统中的 wwwguest 登录处理是几乎完全独立的一部分,数据存储在 wwwguest_shm 共享内存区,结构为 WWW_GUEST_TABLE

#define MAX_WWW_MAP_ITEM (MAX_WWW_GUEST/32)

struct WWW_GUEST_TABLE {
    int hashtab[16][256][256];
    int use_map[MAX_WWW_MAP_ITEM + 1];
        use_map[i] 的从低到高第 j 个 bit 表示当前 guest_entry[i * 32 + j] 是否被使用
    time_t uptime;
        一个标记时间,wwwguest 新登录时如果当前时间和这个标记时间相差
        240 秒以上,就遍历所有 wwwguest 登录踢掉发呆时间过长的登录,同时将
        uptime 设置成当前时间。
    struct WWW_GUEST_S guest_entry[MAX_WWW_GUEST];
        每个 wwwguest 登录的具体信息,结构定义如下
};

struct WWW_GUEST_S {
    int key;
    time_t freshtime;
        上次活动的时间戳,用来计算发呆时间。
    time_t logintime;
    int currentboard;
        当前所在版面的 bid
    struct in_addr fromip;
        来源 IP
};


4.6 bcache,brdshm:版面状态共享内存结构 BCACHE  [ 回目录 ]

全局变量 bcache 指向 .BOARDS 文件的 mmap 数据。bcache[bid - 1] 是版面号为 bid 的那个版面的 boardheader

如此之外,每个版面还有一些状态信息,即全局变量 brdshm 指向的共享内存(标识 BCACHE_SHMKEY),其结构 BCACHE 为:

struct BCACHE {
    int numboards;
        所有版面版面号中最大的那个 bid。主要是遍历等工作可以只循环到 numboards
        为止而无须到 MAXBOARD,以提高效率。
    struct BoardStatus bstatus[MAXBOARD];
        具体版面状态数据
};

其中 BoardStatus 的定义是:

struct BoardStatus {            /* use this to speed up board list */
    int total;
        总文章数。如果版面文章数显示和实际不符就是因为这个字段没同步。
    int lastpost;
        本版最后一篇文章的 id 号,用户看到版面是否有新文章就是从这个字段计算。
    bool updatemark;
        是否被 m 的文章有变动,决定下次用户看被 m 文章列表是否需要重新产生索引
    bool updatetitle;
        是否置底文章有变动,决定下次使用 .DINGDIR 时是否需要重新产生
    bool updateorigin;
        是否原作文章有变动,决定下次使用 .ORIGIN 时是否需要重新产生
    int currentusers;
        当前该版面在线用户数,包括 wwwguest。
    int nowid;
        该版面文章当前已经使用到的 id 号,注意这个字段不一定等于 lastpost,比如
        有人发表了两片文章 id=79,80,然后删掉 id=80 的文章,这时候 lastpost=79,
        但是 nowid=80。在刷新 .BOARDS 时,该字段写回 .BOARDS 文件相应版面的
        idseq 字段以便下次启动时读入。发表帖子的时候系统会自动根据 nowid 分配下
        一个 id 值。如果这个字段出错,web 下浏览会不正常。
    int toptitle;
        本版面置顶文章个数
    struct fileheader topfh[MAX_DING];
        .DINGDIR 的内容,注意 MAX_DING 默认是 10,所以 .DINGDIR 内超过 10 条的
        置顶只会被读入 10 条,更多的显示不出来。
#ifdef HAVE_WFORUM
    int todaynum;
        这个字段没用,呵呵
#endif
};


5. 代码结构  [ 回目录 ]

kbs 系统的核心代码按照目录解释如下:
libsystem/  系统最底层的函数库,以下所有程序都基于它
libBBS/     一些核心函数组成的库 libBBS.so
src/        telnet 服务器程序,静态连接 libBBS.so
sshbbsd/    ssh 服务器程序,其实就是 src/ 下的程序套了一个 ssh 的壳
daemon/     系统守护进程,应该启动服务时最先启动,静态连接 libBBS.so
php/        输出供 PHP 页面使用的函数,动态连接 libBBS.so
local_utl/  各类小实用程序,动态连接 libBBS.so

--EOF--

MF330支持STK,所以可以很方便的切换卡号,这个比在MU350中切换的速度快很多,而且基本不会失败,不像MF350经常要关闭软件再重新打开才正常,所以MF330的STK功能非常好用,用它来做STK切换绝对是首选。

但是,选中的卡号可以打电话,可以看到支持EDGE,China Mobile,但就是不能建立网络连接:(

测试了我自己的动感手机卡以及江苏WAP卡,原卡都是没有问题的,可以很快连上,当然EDGE的速度和TD真的是差远了,用上了3g,你不会再想回去用EDGE了,当然,EDGE cmnet连接的时候使用FTERM上BBS灌水感觉倒没太大的落差:)

我是16IN1的卡,切换了2张卡,都是可以电话,无法进行网络连接的。

至于E620,因为不支持STK,我测试的时候居然一下子就使用到了我那张停机的号,自然下一步就没法继续测了,就此作罢,MF330只用来STK切换,嘿嘿,其它事情还是给ET128去搞吧。

另外今天今天折腾的测试结果来看,WAP卡使用代理后,上TERM BBS的速度还是很不错的。或许是UGiA CMWAP代理服务器2.0 的性能可能有点点问题(还有笔这个更好的GPRS WAP PROXY 代理服务器么?),或者是移动代理网关的限制,上www网站多几个,就很容易掉线了。

所以,最后的结论是:WAP卡只能玩~ 用起来看看几个网页,或者单独的BBS还是很不错的,毕竟很实惠啊,要是炒股或者远程VPN之类的,一不小心就可能会断连的哦。

如果有了宽带,有了NET卡,再折腾这个实在是受罪哦~~~我今天就遭罪了:(  停止折腾,下个月扣费前报停机~~哈哈

 

--EOF--

Mobile Partner 随E行TD设备

华为ET128 和 华为ET6282驱动基本可以说一样?反正安装一个就不用装另外一个了。

使用公版的Mobile Partner(参考这里),然后就可以直接使用伪随E行拉~

但是这个Moblie Partner却无法驱动俺的MU350的,根本找不到设备,开始不明白,我之前用MU350的随E行软件都是可以的,这个不就是随E行么?

今天无聊之中重新将MU350刷回了随E行的固件,再试试Mobile Partner,居然可以找到设备了,原来只能是随E行的固件才可以驱动哦。

可惜MU350刷随E行固件后无法使用STK功能,语音功能还行的~,测试之后还是刷回了中兴的非阉割固件。

下一步如果找到一个方便的STK功能的东东,我还是把MU350也刷成随E行算啦,毕竟可以只安装一个Mobile Partner就可以搞定一切了。

 

 

--EOF--

2 3  

Pages

March 2026

Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Find recent content on the main index or look in the archives to find all content.