<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>可可熊的窝 &#187; XylFTP</title>
	<atom:link href="http://cocobear.info/blog/category/my-programming/xylftp/feed/" rel="self" type="application/rss+xml" />
	<link>http://cocobear.info/blog</link>
	<description>K.I.S.S</description>
	<lastBuildDate>Tue, 17 Aug 2010 10:26:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>读取E680(i,g)的native.db文件</title>
		<link>http://cocobear.info/blog/2009/01/13/data-of-e680-native-db/</link>
		<comments>http://cocobear.info/blog/2009/01/13/data-of-e680-native-db/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 08:51:35 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[XylFTP]]></category>
		<category><![CDATA[bsddb]]></category>
		<category><![CDATA[E680]]></category>

		<guid isPermaLink="false">http://cocobear.info/blog/?p=462</guid>
		<description><![CDATA[E680手机使用了Berkeley DB，关于这个数据库的一些信息可以看我给的链接。 很早以前就有打算要写个Python读取native.db（不知道这个的请G之）中联系人，短信的程序，不过没能成功，这两天又接触到了bsddb，于是今天分析了下这个native.db，没想到原来挺简单的。Berkeley DB本来就是一个很简单的数据库，只是在E680中系统把多个数据库同时存放在了一个文件中native.db，所以不可以直接使用bsddb.btopen来直接打开这个文件。由于Berkeley DB中只是一种类似Python中dict的数据库（key=value）所以要存放手机联系人（有很多字段，如地址，电话...），就需要使用多个数据库，然后每个数据库使用索引来与其它数据库建立联系。按照一般的想法应该是多个数据库的key是作为索引，然后value分别存放各种信息，但E680中的native.db恰好相反。 其实这样的结构也是很简单的，但是我在写代码的时候遇到一个问题，从某个数据库中读取一个key，然后使用bsddb中的get方法去取这个key对应的value，结果确是None，以前好像就是卡在了这一块，似乎与这个value的值有关系，这个value是二进制数据：“< x03x00x00”，不理解为什么这里不直接用整数作为索引而用这么奇怪的数据，或者这里是某种编码？ 先不理这个，不管这个value是什么，使用sorted把每个数据库按照其value排序,下面是所有代码: 读取E680联系人: PYTHON: #!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2 #Author: cocobear.cn@gmail.com &#160; &#34;&#34;&#34; 获取数据库名: db = bsddb.db.DB() db.open('native.db',bsddb.db.DB_UNKNOWN,bsddb.db.DB_RDONLY) db.keys() &#34;&#34;&#34; &#160; import bsddb &#160; db_file = 'native.db' &#160; &#160; databases = &#91;&#40;'姓名','780_contact_table.first name'&#41;,&#40;'手机1','780_contact_table.mobile1'&#41;,&#40;'手机2','780_contact_table.mobile2'&#41;,&#40;'家庭1','780_contact_table.home1'&#41;,&#40;'家庭2','780_contact_table.home2'&#41;,&#40;'工作1','780_contact_table.work1'&#41;,&#40;'工作1','780_contact_table.work1'&#41;,&#93; databases = &#91;&#40;'姓名','780_contact_table.first name'&#41;,&#40;'手机1','780_contact_table.mobile1'&#41;&#93; out = &#91;&#93; &#160; for database in databases: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://cocobear.info/blog/tag/e680/" class="st_tag internal_tag" rel="tag" title="Posts tagged with E680">E680</a>手机使用了<a href="http://www.oracle.com/technology/documentation/berkeley-db/db/index.html">Berkeley DB</a>，关于这个数据库的一些信息可以看我给的链接。</p>
<p>很早以前就有打算要写个<a href="http://cocobear.info/blog/tag/python/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Python">Python</a>读取native.db（不知道这个的请<a href="http://www.google.com">G</a>之）中联系人，短信的程序，不过没能成功，这两天又接触到了<a href="http://docs.python.org/library/bsddb.html">bsddb</a>，于是今天分析了下这个native.db，没想到原来挺简单的。Berkeley DB本来就是一个很简单的数据库，只是在<a href="http://cocobear.info/blog/tag/e680/" class="st_tag internal_tag" rel="tag" title="Posts tagged with E680">E680</a>中系统把多个数据库同时存放在了一个文件中native.db，所以不可以直接使用<a href="http://cocobear.info/blog/tag/bsddb/" class="st_tag internal_tag" rel="tag" title="Posts tagged with bsddb">bsddb</a>.btopen来直接打开这个文件。由于Berkeley DB中只是一种类似<a href="http://cocobear.info/blog/tag/python/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Python">Python</a>中dict的数据库（key=value）所以要存放手机联系人（有很多字段，如地址，电话...），就需要使用多个数据库，然后每个数据库使用索引来与其它数据库建立联系。按照一般的想法应该是多个数据库的key是作为索引，然后value分别存放各种信息，但<a href="http://cocobear.info/blog/tag/e680/" class="st_tag internal_tag" rel="tag" title="Posts tagged with E680">E680</a>中的native.db恰好相反。</p>
<p>其实这样的结构也是很简单的，但是我在写代码的时候遇到一个问题，从某个数据库中读取一个key，然后使用<a href="http://cocobear.info/blog/tag/bsddb/" class="st_tag internal_tag" rel="tag" title="Posts tagged with bsddb">bsddb</a>中的get方法去取这个key对应的value，结果确是None，以前好像就是卡在了这一块，似乎与这个value的值有关系，这个value是二进制数据：“< x03x00x00”，不理解为什么这里不直接用整数作为索引而用这么奇怪的数据，或者这里是某种编码？</p>
<p>先不理这个，不管这个value是什么，使用sorted把每个数据库按照其value排序,下面是所有代码:</p>
<p><a href="#" onclick="xcollapse('X454');return false;">读取E680联系人:<br />
</p>
<div id="X454" style="display: none; border 1px solid=#0000cc; padding: 10px; background-color: transparent;">
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-2">
<div class="python" style="font-family:monospace;">
<ol>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #7f7f7f; font-style: italic;">#!/usr/bin/env python</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #7f7f7f; font-style: italic;"># -*- coding=utf-8 -*-</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #7f7f7f; font-style: italic;">#Using GPL v2</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #7f7f7f; font-style: italic;">#Author: cocobear.cn@gmail.com</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp;</div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #b7c274;">&quot;&quot;&quot;</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #b7c274;">获取数据库名:</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #b7c274;">db = bsddb.db.DB()</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #b7c274;">db.open('native.db',bsddb.db.DB_UNKNOWN,bsddb.db.DB_RDONLY)</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #b7c274;">db.keys()</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #b7c274;">&quot;&quot;&quot;</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp;</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #0088ff;font-weight:bold;">import</span> <span style="color: #23ebc3;">bsddb</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp;</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">db_file = <span style="color: #b7c274;">'native.db'</span> &nbsp; &nbsp;</div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">databases = <span style="color: white;">&#91;</span><span style="color: white;">&#40;</span><span style="color: #b7c274;">'姓名'</span>,<span style="color: #b7c274;">'780_contact_table.first name'</span><span style="color: white;">&#41;</span>,<span style="color: white;">&#40;</span><span style="color: #b7c274;">'手机1'</span>,<span style="color: #b7c274;">'780_contact_table.mobile1'</span><span style="color: white;">&#41;</span>,<span style="color: white;">&#40;</span><span style="color: #b7c274;">'手机2'</span>,<span style="color: #b7c274;">'780_contact_table.mobile2'</span><span style="color: white;">&#41;</span>,<span style="color: white;">&#40;</span><span style="color: #b7c274;">'家庭1'</span>,<span style="color: #b7c274;">'780_contact_table.home1'</span><span style="color: white;">&#41;</span>,<span style="color: white;">&#40;</span><span style="color: #b7c274;">'家庭2'</span>,<span style="color: #b7c274;">'780_contact_table.home2'</span><span style="color: white;">&#41;</span>,<span style="color: white;">&#40;</span><span style="color: #b7c274;">'工作1'</span>,<span style="color: #b7c274;">'780_contact_table.work1'</span><span style="color: white;">&#41;</span>,<span style="color: white;">&#40;</span><span style="color: #b7c274;">'工作1'</span>,<span style="color: #b7c274;">'780_contact_table.work1'</span><span style="color: white;">&#41;</span>,<span style="color: white;">&#93;</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">databases = <span style="color: white;">&#91;</span><span style="color: white;">&#40;</span><span style="color: #b7c274;">'姓名'</span>,<span style="color: #b7c274;">'780_contact_table.first name'</span><span style="color: white;">&#41;</span>,<span style="color: white;">&#40;</span><span style="color: #b7c274;">'手机1'</span>,<span style="color: #b7c274;">'780_contact_table.mobile1'</span><span style="color: white;">&#41;</span><span style="color: white;">&#93;</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">out = <span style="color: white;">&#91;</span><span style="color: white;">&#93;</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp;</div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #0088ff;font-weight:bold;">for</span> database <span style="color: #0088ff;font-weight:bold;">in</span> databases:</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; <span style="color: #7f7f7f; font-style: italic;">#进行单文件多数据库操作 需要每次新建一个环境</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; <span style="color: #7f7f7f; font-style: italic;">#因此下面这行在for循环里</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; db =<span style="color: #23ebc3;">bsddb</span>.<span style="color: white;">db</span>.<span style="color: white;">DB</span><span style="color: white;">&#40;</span><span style="color: white;">&#41;</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; db.<span style="color: #ff7fff;">open</span><span style="color: white;">&#40;</span>db_file,database<span style="color: white;">&#91;</span><span style="color: #00baff;color:#800000;">1</span><span style="color: white;">&#93;</span>,<span style="color: #23ebc3;">bsddb</span>.<span style="color: white;">db</span>.<span style="color: white;">DB_UNKNOWN</span>,<span style="color: #23ebc3;">bsddb</span>.<span style="color: white;">db</span>.<span style="color: white;">DB_RDONLY</span><span style="color: white;">&#41;</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; <span style="color: #7f7f7f; font-style: italic;">#每次读一个数据库</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; <span style="color: #7f7f7f; font-style: italic;">#原本数据库中的value是系统的id key是具体有意义的内容</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; <span style="color: #7f7f7f; font-style: italic;">#下面这行把db.items()得到的list进行反转 为以后有序输出</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; out.<span style="color: white;">append</span><span style="color: white;">&#40;</span><span style="color: #ff7fff;">sorted</span><span style="color: white;">&#40;</span>db.<span style="color: white;">items</span><span style="color: white;">&#40;</span><span style="color: white;">&#41;</span>,key=<span style="color: #0088ff;font-weight:bold;">lambda</span> <span style="color: white;">&#40;</span>k,v<span style="color: white;">&#41;</span>: <span style="color: white;">&#40;</span>v,k<span style="color: white;">&#41;</span><span style="color: white;">&#41;</span><span style="color: white;">&#41;</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; db.<span style="color: white;">close</span><span style="color: white;">&#40;</span><span style="color: white;">&#41;</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp;</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #7f7f7f; font-style: italic;">#格式化输出</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #0088ff;font-weight:bold;">for</span> i <span style="color: #0088ff;font-weight:bold;">in</span> databases:</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; <span style="color: #0088ff;font-weight:bold;">print</span> i<span style="color: white;">&#91;</span><span style="color: #00baff;color:#800000;">0</span><span style="color: white;">&#93;</span>+<span style="color: #b7c274;">&quot;:&quot;</span>,</div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #0088ff;font-weight:bold;">print</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp;</div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #0088ff;font-weight:bold;">for</span> i <span style="color: #0088ff;font-weight:bold;">in</span> <span style="color: #ff7fff;">range</span><span style="color: white;">&#40;</span><span style="color: #ff7fff;">len</span><span style="color: white;">&#40;</span>out<span style="color: white;">&#91;</span><span style="color: #00baff;color:#800000;">0</span><span style="color: white;">&#93;</span><span style="color: white;">&#41;</span><span style="color: white;">&#41;</span>:</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; <span style="color: #0088ff;font-weight:bold;">for</span> j <span style="color: #0088ff;font-weight:bold;">in</span> <span style="color: #ff7fff;">range</span><span style="color: white;">&#40;</span><span style="color: #ff7fff;">len</span><span style="color: white;">&#40;</span>out<span style="color: white;">&#41;</span><span style="color: white;">&#41;</span>:</div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7f7f7f; font-style: italic;">#如果输出内容属于电话号码需要反转</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7f7f7f; font-style: italic;">#根据databases中各位置含义来来判断</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0088ff;font-weight:bold;">if</span> j <span style="color: #0088ff;font-weight:bold;">in</span> <span style="color: white;">&#91;</span><span style="color: #00baff;color:#800000;">1</span>,<span style="color: #00baff;color:#800000;">2</span>,<span style="color: #00baff;color:#800000;">3</span>,<span style="color: #00baff;color:#800000;">4</span>,<span style="color: #00baff;color:#800000;">5</span>,<span style="color: #00baff;color:#800000;">6</span><span style="color: white;">&#93;</span>:</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0088ff;font-weight:bold;">print</span> out<span style="color: white;">&#91;</span>j<span style="color: white;">&#93;</span><span style="color: white;">&#91;</span>i<span style="color: white;">&#93;</span><span style="color: white;">&#91;</span><span style="color: #00baff;color:#800000;">0</span><span style="color: white;">&#93;</span>.<span style="color: white;">decode</span><span style="color: white;">&#40;</span><span style="color: #b7c274;">'utf16'</span><span style="color: white;">&#41;</span><span style="color: white;">&#91;</span>::-<span style="color: #00baff;color:#800000;">1</span><span style="color: white;">&#93;</span>,</div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0088ff;font-weight:bold;">else</span>:</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7f7f7f; font-style: italic;">#非ascii字符使用utf16进行解码</span></div>
</li>
<li style="font-weight: bold; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0088ff;font-weight:bold;">print</span> out<span style="color: white;">&#91;</span>j<span style="color: white;">&#93;</span><span style="color: white;">&#91;</span>i<span style="color: white;">&#93;</span><span style="color: white;">&#91;</span><span style="color: #00baff;color:#800000;">0</span><span style="color: white;">&#93;</span>.<span style="color: white;">decode</span><span style="color: white;">&#40;</span><span style="color: #b7c274;">'utf16'</span><span style="color: white;">&#41;</span>,</div>
</li>
<li style="font-weight: normal; vertical-align:top;color:#3A6A8B;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">&nbsp; &nbsp; <span style="color: #0088ff;font-weight:bold;">print</span></div>
</li>
</ol>
</div>
</div>
</div>
<p>
</div>
<p>不到50行就搞定了:-)</p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2009/01/13/data-of-e680-native-db/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>俺又从伟大的首都回来了-续</title>
		<link>http://cocobear.info/blog/2007/10/29/%e4%bf%ba%e5%8f%88%e4%bb%8e%e4%bc%9f%e5%a4%a7%e7%9a%84%e9%a6%96%e9%83%bd%e5%9b%9e%e6%9d%a5%e4%ba%86-%e7%bb%ad/</link>
		<comments>http://cocobear.info/blog/2007/10/29/%e4%bf%ba%e5%8f%88%e4%bb%8e%e4%bc%9f%e5%a4%a7%e7%9a%84%e9%a6%96%e9%83%bd%e5%9b%9e%e6%9d%a5%e4%ba%86-%e7%bb%ad/#comments</comments>
		<pubDate>Mon, 29 Oct 2007 15:12:04 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[XylFTP]]></category>

		<guid isPermaLink="false">http://cocobear.info/blog/2007/10/29/%e4%bf%ba%e5%8f%88%e4%bb%8e%e4%bc%9f%e5%a4%a7%e7%9a%84%e9%a6%96%e9%83%bd%e5%9b%9e%e6%9d%a5%e4%ba%86-%e7%bb%ad/</guid>
		<description><![CDATA[第二天早上还正睡得好着呢，就被一阵电话铃给吵醒了，本来以为是老大打得还准备埋怨两句，没想到是王老师打的:-) 出去吃了个早点，就去了决赛地点，已经有好多参赛的小组来了，都是很年轻的小伙，还看到了嘉宾名单里有徐继哲，呵呵，又一次要见到他了，还有宫敏，程勇（做jfox的)，苏哲（google的人，做scim的，不过因为临时有时没能到场)。 没想到的是最后进入决赛的9支队伍除了我们和东软的一队，其它的都是中科院各所的研究生，他们的项目里有两个我比较感兴趣，都是python做的，一个是搜索引擎，另一个是多媒体编辑器，不过多媒体编辑器不太完整，只实现了播放的功能因此最后和我们一样只取得了优秀奖。 值得一提的是东软那组做的东西，具有很浓重的商业气味，就连PPT感觉都很专业，很明显是受过专业的、有实际项目经验的老师培养，东西也具有一定的实际意义：可定制企业管理内核。 比赛的结果并不重要，我们也没有专门为这个比赛去准备，因此项目的技术含量和别人显然不在一个档次，因此没有好的名次是很明显的，不过论开发模式，我们应该算是最纯粹、最全面的开源软件开发模式。而且有些项目甚至只有Windows平台上的东西，让我不爽的很！ 评奖完毕后徐继哲又和我们聊了一会儿，宫敏知道我们是西安来的也过来凑热闹一块儿聊了一会儿。然后就一起合了影后，他们便离开了。 由于前一天找了两个多小时没找到清华正门，吃完饭后我们继续去寻找清华正门，没想到离我们住得地方那么近，昨天绕了一个大圈。又逛了逛清华，看了看以前的旧门，就坐公交去北京西站了。 BWT：俺和那个做多媒体的研究生聊了一会儿，他说到北京现在博士学（和海归硕士）历才给解决户口问题，因此他毕业都不打算留北京了。后来又听除哲继说他目前还没有北京的户口，真是太和谐了啊，以后北京全住博士！！]]></description>
			<content:encoded><![CDATA[<p>第二天早上还正睡得好着呢，就被一阵电话铃给吵醒了，本来以为是老大打得还准备埋怨两句，没想到是王老师打的:-)</p>
<p>出去吃了个早点，就去了决赛地点，已经有好多参赛的小组来了，都是很年轻的小伙，还看到了嘉宾名单里有徐继哲，呵呵，又一次要见到他了，还有宫敏，程勇（做jfox的)，苏哲（google的人，做scim的，不过因为临时有时没能到场)。</p>
<p>没想到的是最后进入决赛的9支队伍除了我们和东软的一队，其它的都是中科院各所的研究生，他们的项目里有两个我比较感兴趣，都是<a href="http://cocobear.info/blog/tag/python/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Python">python</a>做的，一个是搜索引擎，另一个是多媒体编辑器，不过多媒体编辑器不太完整，只实现了播放的功能因此最后和我们一样只取得了优秀奖。</p>
<p>值得一提的是东软那组做的东西，具有很浓重的商业气味，就连PPT感觉都很专业，很明显是受过专业的、有实际项目经验的老师培养，东西也具有一定的实际意义：可定制企业管理内核。</p>
<p>比赛的结果并不重要，我们也没有专门为这个比赛去准备，因此项目的技术含量和别人显然不在一个档次，因此没有好的名次是很明显的，不过论开发模式，我们应该算是最纯粹、最全面的开源软件开发模式。而且有些项目甚至只有Windows平台上的东西，让我不爽的很！</p>
<p>评奖完毕后徐继哲又和我们聊了一会儿，宫敏知道我们是西安来的也过来凑热闹一块儿聊了一会儿。然后就一起合了影后，他们便离开了。</p>
<p>由于前一天找了两个多小时没找到清华正门，吃完饭后我们继续去寻找清华正门，没想到离我们住得地方那么近，昨天绕了一个大圈。又逛了逛清华，看了看以前的旧门，就坐公交去北京西站了。</p>
<p>BWT：俺和那个做多媒体的研究生聊了一会儿，他说到北京现在博士学（和海归硕士）历才给解决户口问题，因此他毕业都不打算留北京了。后来又听除哲继说他目前还没有北京的户口，真是太和谐了啊，以后北京全住博士！！</p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2007/10/29/%e4%bf%ba%e5%8f%88%e4%bb%8e%e4%bc%9f%e5%a4%a7%e7%9a%84%e9%a6%96%e9%83%bd%e5%9b%9e%e6%9d%a5%e4%ba%86-%e7%bb%ad/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>xylftp服务器端V1.0发布</title>
		<link>http://cocobear.info/blog/2007/06/25/xylftp%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%afv10%e5%8f%91%e5%b8%83/</link>
		<comments>http://cocobear.info/blog/2007/06/25/xylftp%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%afv10%e5%8f%91%e5%b8%83/#comments</comments>
		<pubDate>Mon, 25 Jun 2007 14:30:35 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[XylFTP]]></category>
		<category><![CDATA[编程相关]]></category>

		<guid isPermaLink="false">http://cocobear.info/blog/?p=149</guid>
		<description><![CDATA[原引：http://www.xiyoulinux.cn/blog/?p=14 xylftp服务器端经过了长期测试和修复，现在已经基本完善和稳定。我们宣布正式发布我们的第一个版本供大家使用！ a) 下载： xylftp项目的的主页在： https://sourceforge.net/projects/xylftp xylftp服务器端1.0版本可以在这里下载： xylftp-server-1.0.tar.gz b) 安装： 安装方法：用命令 tar -xvzf xylftp-server-1.0.tar.gz解压，然后进入文件目录 xylftp/server/src/，运行”make install”命令即可完成安装。 c) 卸载： 卸载方法：进入文件目录 xylftp/client/src/，运行”make uninstall”命令即可完成 软件卸载。 d) 开发： xylftp的CVS在： http://xylftp.cvs.sourceforge.net/ 截止目前，服务器端C代码总量为2400行。参与服务器端编写的人员有： 1.董溥：完成守护进程的建立，socket连接以及写日志，实现主程序的流程。 2.郭拓：完成do_list命令。 3.贾孟树：完成parse_cmd.c,telnet.c，以及do_quit命令，以及测试和维护工作。 4.林峰：完成配置文件的解析，完成do_user,do_pass命令,参与do_syst,do_type,do_noop命令以及测试和维护工作。 5.刘伟：完成do_pwd,do_cdup,do_cwd,do_rnfr,do_rnto,do_port命令。 6.刘洋：完成do_stat，do_mode,do_fail命令,以及测试和维护工作。 7.聂海海：完成do_retr,do_mkd,do_rmd,do_dele命令。 8.王聪：完成do_stru命令,完成Makefile编写,并维护了王老师的三个命令以及整个流程的测试和维护工作。 9.王亚刚老师：完成do_abor,do_stor,do_pasv命令。 感谢各位参与！ 欢迎大家测试使用，并把信息及时反馈给我们！ （错误报告请发送至xiyoulinux@googlegroups.com） 由于个人原因在编码阶段我做了很少的工作，在这里再次对所有的朋友说一声“对不起！”。一个学期了，终于有了结果，象刘洋同学说的“大家通过一起做一个项目，一起风雨走来，一起体味其中的酸甜苦辣”，不管怎么样，终究是走了过来，确实没有什么槛是过不去的！]]></description>
			<content:encoded><![CDATA[<p>原引：http://www.xiyoulinux.cn/blog/?p=14</p>
<blockquote></blockquote>
<blockquote><p>xylftp服务器端经过了长期测试和修复，现在已经基本完善和稳定。我们宣布正式发布我们的第一个版本供大家使用！</p>
<p>a) 下载：</p>
<p>xylftp项目的的主页在：</p>
<p>https://sourceforge.net/projects/xylftp</p>
<p>xylftp服务器端1.0版本可以在这里下载：</p>
<p><a TARGET="_blank" HREF="http://xiyoulinux.cn/down/xylftp-server-1.0.tar.gz">xylftp-server-1.0.tar.gz</a></p>
<p>b) 安装：</p>
<p>安装方法：用命令 tar -xvzf xylftp-server-1.0.tar.gz解压，然后进入文件目录<br />
xylftp/server/src/，运行”make install”命令即可完成安装。</p>
<p>c) 卸载：</p>
<p>卸载方法：进入文件目录 xylftp/client/src/，运行”make uninstall”命令即可完成<br />
软件卸载。</p>
<p>d) 开发：</p>
<p>xylftp的CVS在：</p>
<p>http://xylftp.cvs.sourceforge.net/</p>
<p>截止目前，服务器端C代码总量为2400行。参与服务器端编写的人员有：</p>
<p>1.董溥：完成守护进程的建立，socket连接以及写日志，实现主程序的流程。<br />
2.郭拓：完成do_list命令。<br />
3.贾孟树：完成parse_cmd.c,telnet.c，以及do_quit命令，以及测试和维护工作。<br />
4.林峰：完成配置文件的解析，完成do_user,do_pass命令,参与do_syst,do_type,do_noop命令以及测试和维护工作。<br />
5.刘伟：完成do_pwd,do_cdup,do_cwd,do_rnfr,do_rnto,do_port命令。<br />
6.刘洋：完成do_stat，do_mode,do_fail命令,以及测试和维护工作。<br />
7.聂海海：完成do_retr,do_mkd,do_rmd,do_dele命令。<br />
8.王聪：完成do_stru命令,完成Makefile编写,并维护了王老师的三个命令以及整个流程的测试和维护工作。<br />
9.王亚刚老师：完成do_abor,do_stor,do_pasv命令。</p>
<p>感谢各位参与！</p>
<p>欢迎大家测试使用，并把信息及时反馈给我们！<br />
（错误报告请发送至xiyoulinux@googlegroups.com）</p></blockquote>
<blockquote></blockquote>
<p>由于个人原因在编码阶段我做了很少的工作，在这里再次对所有的朋友说一声“对不起！”。一个学期了，终于有了结果，象<a TARGET="_blank" HREF="http://www.amankwahly.cn">刘洋</a>同学说的“大家通过一起做一个项目，一起风雨走来，一起体味其中的酸甜苦辣”，不管怎么样，终究是走了过来，确实没有什么槛是过不去的！</p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2007/06/25/xylftp%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%afv10%e5%8f%91%e5%b8%83/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>24小时才找到的一个bug</title>
		<link>http://cocobear.info/blog/2007/05/18/24%e5%b0%8f%e6%97%b6%e6%89%8d%e6%89%be%e5%88%b0%e7%9a%84%e4%b8%80%e4%b8%aabug/</link>
		<comments>http://cocobear.info/blog/2007/05/18/24%e5%b0%8f%e6%97%b6%e6%89%8d%e6%89%be%e5%88%b0%e7%9a%84%e4%b8%80%e4%b8%aabug/#comments</comments>
		<pubDate>Fri, 18 May 2007 08:23:32 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[XylFTP]]></category>
		<category><![CDATA[编程相关]]></category>

		<guid isPermaLink="false">http://cocobear.info/wordpress/?p=105</guid>
		<description><![CDATA[由于写FTP服务器时有多处需要用到socket套接字，也为了以后写Linux下的网络程序方便就把socket套接字进行了封装。 安装socket套接的的工作原理把socket一套函数(socket,bind,listen,accept,connect)封装为三个函数：_listen,_accept,_connect。 _listen函数中首先使用socket创建一个套接字，因为是在本机监听，所以使用的地址就是本机的IP地址。然后使用bind把socket生成的socket_fd与本机的一个端口号绑定，这个端口号为_listen的唯一参数。最后使用listen开始监听，本函数返回一个文件描述符，也就是socket产生的文件描述符。 _accept函数中直接调用系统的accept函数阻塞自己，直到有客户请求就接受请求，并且返回一个connect_fd的文件描述符（由accept产生），该函数的参数为_listen返回的文件描述符。 _connect函数与_listen函数类似也是先使用socket创建一个套接字，不过这里使用的地址就是服务器的地址与端口号，而不是本机地址与端口，这两个由该函数的参数给出。接下来它就使用connect去连接指定服务器的端口。 在测试的时候发现了一个bug，_accept返回的值一直为0，昨天中午开始找了半天的时间也没有发现问题，最后无耐之下使用了全局变量，才使用整个程序能够正常运行，不过这样一来就没有达到我封装socket的目的，而且也没有找到bug的原因，今天中午继续查bug，结果发现即使我封装的_accept只有一行语句: return accept(socket_fd,(struct sockaddr *)&#038;client_addr,&#038;len); 仍然出错，最后看了一下调用_accept那一块的代码，原来问题出在下面的代码： 35 if ((connect_fd = _accept(socket_fd,client) == -1)) { 36 exit(0); 37 } 竟然找了N长时间没有发现！]]></description>
			<content:encoded><![CDATA[<p>由于写FTP服务器时有多处需要用到socket套接字，也为了以后写Linux下的网络程序方便就把socket套接字进行了封装。</p>
<p>安装socket套接的的工作原理把socket一套函数(socket,bind,listen,accept,connect)封装为三个函数：_listen,_accept,_connect。</p>
<p>_listen函数中首先使用socket创建一个套接字，因为是在本机监听，所以使用的地址就是本机的IP地址。然后使用bind把socket生成的socket_fd与本机的一个端口号绑定，这个端口号为_listen的唯一参数。最后使用listen开始监听，本函数返回一个文件描述符，也就是socket产生的文件描述符。</p>
<p>_accept函数中直接调用系统的accept函数阻塞自己，直到有客户请求就接受请求，并且返回一个connect_fd的文件描述符（由accept产生），该函数的参数为_listen返回的文件描述符。</p>
<p>_connect函数与_listen函数类似也是先使用socket创建一个套接字，不过这里使用的地址就是服务器的地址与端口号，而不是本机地址与端口，这两个由该函数的参数给出。接下来它就使用connect去连接指定服务器的端口。</p>
<p>在测试的时候发现了一个bug，_accept返回的值一直为0，昨天中午开始找了半天的时间也没有发现问题，最后无耐之下使用了全局变量，才使用整个程序能够正常运行，不过这样一来就没有达到我封装socket的目的，而且也没有找到bug的原因，今天中午继续查bug，结果发现即使我封装的_accept只有一行语句:<br />
return accept(socket_fd,(struct sockaddr *)&#038;client_addr,&#038;len);<br />
仍然出错，最后看了一下调用_accept那一块的代码，原来问题出在下面的代码：</p>
<blockquote><p>
   35 		if ((connect_fd = _accept(socket_fd,client) == -1)) {<br />
   36 			exit(0);<br />
   37 		}</p></blockquote>
<p>竟然找了N长时间没有发现！</p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2007/05/18/24%e5%b0%8f%e6%97%b6%e6%89%8d%e6%89%be%e5%88%b0%e7%9a%84%e4%b8%80%e4%b8%aabug/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>最近项目的进展</title>
		<link>http://cocobear.info/blog/2007/05/15/%e6%9c%80%e8%bf%91%e9%a1%b9%e7%9b%ae%e7%9a%84%e8%bf%9b%e5%b1%95/</link>
		<comments>http://cocobear.info/blog/2007/05/15/%e6%9c%80%e8%bf%91%e9%a1%b9%e7%9b%ae%e7%9a%84%e8%bf%9b%e5%b1%95/#comments</comments>
		<pubDate>Tue, 15 May 2007 13:19:32 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[XylFTP]]></category>
		<category><![CDATA[编程相关]]></category>

		<guid isPermaLink="false">http://cocobear.info/wordpress/?p=103</guid>
		<description><![CDATA[五一期间由于我们服务端这边的人基本上都没空，所以五一的时候就和客户端拉下了很大的距离。再加上前面一段时间一直停留在对模块的划分上，所以我们这边是完全跟不上客户端的脚步了。 五一放完假我们似乎又停到了详细设计上，这又是一块难啃的骨头，因为是C语言编程，如果按照软件工程的规范来做，详细设置的时候定义好所有要用到的函数，包括参数，这样对于我们这些没接触过软件工程的人来说无疑是一个巨大的难题。这似乎是不可能的事情，等了两三天毫无进展。在周三的例会上，王老师提出了这个问题，建议我们详细设计与编码同时开始，本来我也打算提出这个建议，没想到王老师先说了:) 接下来我们就开始进行编码了，不过从这几天的情况来看并不是很乐观，有一个很大的问题就是沟通，也许是从也没有在一块试着多人合作写代码，在接口的处理上，一些常用功能的封装上存在着很大的问题。 经过了这段时间的煅炼，觉得一个人在团队中的合作精神确实是非常重要的，而一个既有技术，又有领导才能的人更是难得。]]></description>
			<content:encoded><![CDATA[<p>五一期间由于我们服务端这边的人基本上都没空，所以五一的时候就和客户端拉下了很大的距离。再加上前面一段时间一直停留在对模块的划分上，所以我们这边是完全跟不上客户端的脚步了。</p>
<p>五一放完假我们似乎又停到了详细设计上，这又是一块难啃的骨头，因为是C语言编程，如果按照软件工程的规范来做，详细设置的时候定义好所有要用到的函数，包括参数，这样对于我们这些没接触过软件工程的人来说无疑是一个巨大的难题。这似乎是不可能的事情，等了两三天毫无进展。在周三的例会上，王老师提出了这个问题，建议我们详细设计与编码同时开始，本来我也打算提出这个建议，没想到王老师先说了:)</p>
<p>接下来我们就开始进行编码了，不过从这几天的情况来看并不是很乐观，有一个很大的问题就是沟通，也许是从也没有在一块试着多人合作写代码，在接口的处理上，一些常用功能的封装上存在着很大的问题。</p>
<p>经过了这段时间的煅炼，觉得一个人在团队中的合作精神确实是非常重要的，而一个既有技术，又有领导才能的人更是难得。</p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2007/05/15/%e6%9c%80%e8%bf%91%e9%a1%b9%e7%9b%ae%e7%9a%84%e8%bf%9b%e5%b1%95/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>概要设计中结构图</title>
		<link>http://cocobear.info/blog/2007/04/12/%e6%a6%82%e8%a6%81%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%bb%93%e6%9e%84%e5%9b%be/</link>
		<comments>http://cocobear.info/blog/2007/04/12/%e6%a6%82%e8%a6%81%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%bb%93%e6%9e%84%e5%9b%be/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 10:39:59 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[XylFTP]]></category>
		<category><![CDATA[编程相关]]></category>

		<guid isPermaLink="false">http://cocobear.info/wordpress/?p=66</guid>
		<description><![CDATA[在前一次的基础上做了较大的改动，欢迎指正，采用第二个副图： update1:删除了bind()参数，先前bind()参数使用了IP地址。 update2:使用刘洋同学画的那个，把处理的描述改为了中文描述，而不是一些不太清楚的函数，修改了初始化部分的顺序，最开始读取配置文件。]]></description>
			<content:encoded><![CDATA[<p>在前一次的基础上做了较大的改动，欢迎指正，采用第二个副图：</p>
<p><img src='http://cocobear.info/blog/download/2007/04/default.thumbnail.png' alt='default.png' /></p>
<p>update1:删除了bind()参数，先前bind()参数使用了IP地址。<br />
update2:使用刘洋同学画的那个，把处理的描述改为了中文描述，而不是一些不太清楚的函数，修改了初始化部分的顺序，最开始读取配置文件。</p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2007/04/12/%e6%a6%82%e8%a6%81%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%bb%93%e6%9e%84%e5%9b%be/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>需求分析[定稿]</title>
		<link>http://cocobear.info/blog/2007/04/12/%e9%9c%80%e6%b1%82%e5%88%86%e6%9e%90%e5%ae%9a%e7%a8%bf/</link>
		<comments>http://cocobear.info/blog/2007/04/12/%e9%9c%80%e6%b1%82%e5%88%86%e6%9e%90%e5%ae%9a%e7%a8%bf/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 08:51:27 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[XylFTP]]></category>
		<category><![CDATA[编程相关]]></category>

		<guid isPermaLink="false">http://cocobear.info/wordpress/?p=63</guid>
		<description><![CDATA[主要内容由刘洋同学起草，在贾孟树、刘伟等同学的基础上经过大家讨论由我对配置文件更新，服务端实现的命令主要由我起草，在大家的讨论下确定，刘洋同学再次在这些基础上对需求分析进行改进。 最后我修改了其中较明显的一些错误，添加了命令对应的返回码，并在配置文件中添加FTP使用的端口号，使用户可以自行配置FTP监听的端口号。 需求分析]]></description>
			<content:encoded><![CDATA[<p>主要内容由刘洋同学起草，在贾孟树、刘伟等同学的基础上经过大家讨论由我对配置文件更新，服务端实现的命令主要由我起草，在大家的讨论下确定，刘洋同学再次在这些基础上对需求分析进行改进。</p>
<p>最后我修改了其中较明显的一些错误，添加了命令对应的返回码，并在配置文件中添加FTP使用的端口号，使用户可以自行配置FTP监听的端口号。</p>
<p><a href='http://cocobear.info/blog/download/2007/04/ssrsv0_4.pdf' title='需求分析'>需求分析</a></p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2007/04/12/%e9%9c%80%e6%b1%82%e5%88%86%e6%9e%90%e5%ae%9a%e7%a8%bf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于FTP的一些东西</title>
		<link>http://cocobear.info/blog/2007/04/09/%e5%85%b3%e4%ba%8eftp%e7%9a%84%e4%b8%80%e4%ba%9b%e4%b8%9c%e8%a5%bf/</link>
		<comments>http://cocobear.info/blog/2007/04/09/%e5%85%b3%e4%ba%8eftp%e7%9a%84%e4%b8%80%e4%ba%9b%e4%b8%9c%e8%a5%bf/#comments</comments>
		<pubDate>Mon, 09 Apr 2007 14:38:17 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[XylFTP]]></category>
		<category><![CDATA[编程相关]]></category>

		<guid isPermaLink="false">http://cocobear.info/wordpress/?p=57</guid>
		<description><![CDATA[还没有博客里介绍过这个项目，这里正式的介绍一下，项目名称：xylFTP，偶们Linux兴趣小组发起的一个Linux下的项目，目的是为了熟悉Linux下的网络编程，也积累一下团体合作，软件开发的经验。我在项目开始的时候提出了遵循软件开发标准这一建议，后来得到大家的支持，但这也成为摆在我们面前的一个重大难题，我们中几乎所有的人都是自己写写代码，注释有时候都写的不齐，而这次要完完整整的写文档，这确实是一个很大的突破，也是一个挑战，已经过去了三个星期的时间，大家的时间用来熟悉FTP协议本身，和完成初期的文档，例如需求分析，概要设计，进度确实有些慢了，不过也是有原因的，对协议的不清楚以及对文档的陌生，总算一步一步走下来了，现在需求分析已经基本定稿，概要设计也有了雏型，对协议也清楚了很多。 我们是分两个小组来做服务端与客户端，服务端使用的是C语言，当然是在Linux下做了，客户端使用的是Java。我参加的是服务端的设计，因为对协议看的比较多些，上星期的时候讲了一下FTP工作的整个过程，做了一个PPT。 但是在服务器的具体socket处理方面还是不太清楚，今天下午和王聪讨论的时候逐渐把整个FTP socket一块的东西弄的清楚了很多，也有了今天晚上黑板上讲的一些东西，觉得两个人在一块讨论确实能够解决很多问题，而且能学到很多东西。 PPT下载 点击查看]]></description>
			<content:encoded><![CDATA[<p>还没有博客里介绍过这个项目，这里正式的介绍一下，项目名称：xylFTP，偶们Linux兴趣小组发起的一个Linux下的项目，目的是为了熟悉Linux下的网络编程，也积累一下团体合作，软件开发的经验。我在项目开始的时候提出了遵循软件开发标准这一建议，后来得到大家的支持，但这也成为摆在我们面前的一个重大难题，我们中几乎所有的人都是自己写写代码，注释有时候都写的不齐，而这次要完完整整的写文档，这确实是一个很大的突破，也是一个挑战，已经过去了三个星期的时间，大家的时间用来熟悉FTP协议本身，和完成初期的文档，例如需求分析，概要设计，进度确实有些慢了，不过也是有原因的，对协议的不清楚以及对文档的陌生，总算一步一步走下来了，现在需求分析已经基本定稿，概要设计也有了雏型，对协议也清楚了很多。</p>
<p>我们是分两个小组来做服务端与客户端，服务端使用的是C语言，当然是在Linux下做了，客户端使用的是Java。我参加的是服务端的设计，因为对协议看的比较多些，上星期的时候讲了一下FTP工作的整个过程，做了一个PPT。</p>
<p>但是在服务器的具体socket处理方面还是不太清楚，今天下午和王聪讨论的时候逐渐把整个FTP socket一块的东西弄的清楚了很多，也有了今天晚上黑板上讲的一些东西，觉得两个人在一块讨论确实能够解决很多问题，而且能学到很多东西。</p>
<p><a href=http://cocobear.info/download/ppt.odp>PPT下载</a><br />
<a href=http://cocobear.info/download/control.png>点击查看</a></p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2007/04/09/%e5%85%b3%e4%ba%8eftp%e7%9a%84%e4%b8%80%e4%ba%9b%e4%b8%9c%e8%a5%bf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>项目文档&#8211;概要设计说明书 V0.1</title>
		<link>http://cocobear.info/blog/2007/04/06/%e9%a1%b9%e7%9b%ae%e6%96%87%e6%a1%a3-%e6%a6%82%e8%a6%81%e8%ae%be%e8%ae%a1%e8%af%b4%e6%98%8e%e4%b9%a6-v01/</link>
		<comments>http://cocobear.info/blog/2007/04/06/%e9%a1%b9%e7%9b%ae%e6%96%87%e6%a1%a3-%e6%a6%82%e8%a6%81%e8%ae%be%e8%ae%a1%e8%af%b4%e6%98%8e%e4%b9%a6-v01/#comments</comments>
		<pubDate>Sat, 07 Apr 2007 02:18:34 +0000</pubDate>
		<dc:creator>可可熊</dc:creator>
				<category><![CDATA[XylFTP]]></category>
		<category><![CDATA[编程相关]]></category>

		<guid isPermaLink="false">http://cocobear.info/wordpress/?p=50</guid>
		<description><![CDATA[一 引言 1.1 编写目的 确定整个程序设计框架，以及需要实现的功能，对程序接口进行定义，定义运行状态以及出错处理。 1.2 背景 a.项目名称：xylFTP(待定) b. 任务提出者：王老师 开发者：见软件需求说明书1.2.b 用户：服务端主要面向Linux用户，客户端面向所有可以使用JVM的用户。 中心：运行FTP服务器的机器 1.3 定义 JVM：java virtual machine FTP：File Transfer Protocol 1.4 参考资料 a.软件需求说明书[url]http://wangcong.org/blog/?p=119[/url] b.见软件需求说明书1.4 [b]二 总体设计[/b] 2.1 需求规定 a.输入：服务端需要配置文件xylftp.con，不接受其它参数输入。客户端接受从终端输入的命令，以及启动客户端所带参数。 -u $user 使用$user连接，当不使用-u时使用shell用户名连接。 -h [$command]显示客户端所允许的命令，$command指定的情况下显示$command相关使用方法。 -v 显示版本信息 -d 显示更多额外信息，供查错使用。 -a 自动登录，使用.xylftpauto.conf文件中包含的内容自动登录 b.输出：服务端在运行过程中产生文件xylftp.log，收集一些客户端连接信息，包括登录时间，IP，下载、上传文件、数据量，以及断线时间。客户端响应终端输入显示帮助，以及服务端返回的信息，同时保存登录时用户信息在xylftpauto.conf文件中，供自动登录使用。 2.2 运行环境 服务端支持i368，x86_64，客户端适用于所有可使用JVM的机器上。 2.3 基本设计概念和处理流程 服务端： 目的是设计一个简洁，高效的FTP服务器，并不涉及到较为复杂的安全策略(有关FTP的明文传输)，以较快的速度完成整体框架的设计，然后对具体模块进行改进，优化。 服务端程序配套的带有一个xylftptool的工具，可以用它来生成配置文件(当配置文件被改乱或者丢失的时候使用)，以及检查配置文件的错误，同时可以生成用户数据，采用md5加密存储。服务端启动的时候先读取xylftp.conf文件，将文件中的参数传递给主程序，然后通过参数解析函数完成参数的处理，把相应的值赋给全局变量以及函数。主程序调用ftp_linsten()函数进行监听,如果相应端口(未必是21,可根据xylftp.conf文件更改)有连接请求，则调用ftp_server()处理，此时应该考虑服务端使用的是passive还是port模式，分别采取不同的处理方式，如果是passive模式，则应开启相应的data port等待客户端的数据连接，如果是port模式，则使用端口20数据传输的初始化。随后该函数使用fork()建立新的进程处理用户请求。主程序继续处于ftp_listen()状态，直到进程被杀死。 客户端; 设计一个简单，实用的FTP客户端，支持常用的FTP命令，使用java标准库开发，并且预留GUI接口。 客户端首先接收命令行的输入，使用命令解释程序来解析命令，如果本地可以完全的命令，直接调用相应的函数完成，如果需要传送到远程FTP主机，则传输相应的命令到远程FTP。同时客户端不断接收服务端的处理结果，并显示。 2.4 [...]]]></description>
			<content:encoded><![CDATA[<p>一	引言</p>
<p>1.1	编写目的</p>
<p>		确定整个程序设计框架，以及需要实现的功能，对程序接口进行定义，定义运行状态以及出错处理。</p>
<p>1.2	背景</p>
<p>		a.项目名称：xylFTP(待定)<br />
		b.<br />
		任务提出者：王老师<br />
		开发者：见软件需求说明书1.2.b<br />
		用户：服务端主要面向Linux用户，客户端面向所有可以使用JVM的用户。<br />
		中心：运行FTP服务器的机器</p>
<p>1.3	定义</p>
<p>		JVM：java virtual machine<br />
		FTP：File Transfer Protocol</p>
<p>1.4	参考资料</p>
<p>		a.软件需求说明书[url]http://wangcong.org/blog/?p=119[/url]<br />
		b.见软件需求说明书1.4</p>
<p>[b]二		总体设计[/b]</p>
<p>2.1	需求规定</p>
<p>		a.输入：服务端需要配置文件xylftp.con，不接受其它参数输入。客户端接受从终端输入的命令，以及启动客户端所带参数。<br />
		-u	$user 使用$user连接，当不使用-u时使用shell用户名连接。<br />
		-h	[$command]显示客户端所允许的命令，$command指定的情况下显示$command相关使用方法。<br />
		-v	显示版本信息<br />
		-d	显示更多额外信息，供查错使用。<br />
		-a	自动登录，使用.xylftpauto.conf文件中包含的内容自动登录</p>
<p>		b.输出：服务端在运行过程中产生文件xylftp.log，收集一些客户端连接信息，包括登录时间，IP，下载、上传文件、数据量，以及断线时间。客户端响应终端输入显示帮助，以及服务端返回的信息，同时保存登录时用户信息在xylftpauto.conf文件中，供自动登录使用。</p>
<p>2.2	运行环境</p>
<p>		服务端支持i368，x86_64，客户端适用于所有可使用JVM的机器上。</p>
<p>2.3	基本设计概念和处理流程</p>
<p>		服务端：<br />
		目的是设计一个简洁，高效的FTP服务器，并不涉及到较为复杂的安全策略(有关FTP的明文传输)，以较快的速度完成整体框架的设计，然后对具体模块进行改进，优化。<br />
		服务端程序配套的带有一个xylftptool的工具，可以用它来生成配置文件(当配置文件被改乱或者丢失的时候使用)，以及检查配置文件的错误，同时可以生成用户数据，采用md5加密存储。服务端启动的时候先读取xylftp.conf文件，将文件中的参数传递给主程序，然后通过参数解析函数完成参数的处理，把相应的值赋给全局变量以及函数。主程序调用ftp_linsten()函数进行监听,如果相应端口(未必是21,可根据xylftp.conf文件更改)有连接请求，则调用ftp_server()处理，此时应该考虑服务端使用的是passive还是port模式，分别采取不同的处理方式，如果是passive模式，则应开启相应的data port等待客户端的数据连接，如果是port模式，则使用端口20数据传输的初始化。随后该函数使用fork()建立新的进程处理用户请求。主程序继续处于ftp_listen()状态，直到进程被杀死。</p>
<p>		客户端;<br />
		设计一个简单，实用的FTP客户端，支持常用的FTP命令，使用java标准库开发，并且预留GUI接口。<br />
		客户端首先接收命令行的输入，使用命令解释程序来解析命令，如果本地可以完全的命令，直接调用相应的函数完成，如果需要传送到远程FTP主机，则传输相应的命令到远程FTP。同时客户端不断接收服务端的处理结果，并显示。</p>
<p>2.4	结构</p>
<p>		服务端：</p>
<p>2.5	功能需求与程序的关系</p>
<p>		服务端提供FTP服务，客户端连接服务器使用其提供的功能。</p>
<p>2.6	人工处理过程</p>
<p>		无人工处理过程</p>
<p>2.7	尚未解决的问题</p>
<p>		服务端运行模式。</p>
<p>[b]三	接口设计	[/b]</p>
<p>3.1	用户接口</p>
<p>		服务端不向用户提供任何命令，用户可以通过修改配置文件xylftp.conf文件来实现对服务端启动方式的修改。</p>
<p>		客户端提供命令如help，quit,bye等，详见需求规定(暂时未完成)</p>
<p>3.2	外部接口</p>
<p>		服务端需要在运行有Linux系统主机的shell下启动，无交互模式。客户端需要JVM的支持。</p>
<p>3.3	内部接口</p>
<p>		见2.4结构</p>
<p>[b]四	运行设计[/b]</p>
<p>4.1	运行模块组合</p>
<p>		(vsftpd有两种启动模式：stand alone以及super daemon,不知道我们需要这样做吗?具体两种方式见附文一。<br />
		服务端支持被动模式吗?如果支持被动模式难度似乎会增加很多，见附文二)</p>
<p>4.2	运行控制</p>
<p>		由4.1决定</p>
<p>4.3	运行时间</p>
<p>		由4.1决定</p>
<p>[b]五	系统数据结构设计[/b]</p>
<p>5.1	逻辑结构设计要点</p>
<p>		应该要用到排序算法可使用哈唏排序</p>
<p>5.2	物理结构设计要点</p>
<p>		直接使用系统调用存储文件，不考虑存取的物理关系。</p>
<p>5.3	数据结构与程序的关系</p>
<p>		没必要</p>
<p>[b]六	系统出错处理设计[/b]</p>
<p>6.1	出错信息</p>
<p>		服务端：<br />
		error01-读取xylftp.conf文件错误，请确认xylftp.conf存在，并且有读取权限。<br />
		error02-xylftp.conf文件格式错误，请根据说明更改xylftp.conf文件内容。<br />
		error03-xylftp已经运行，结束xylftp进行，重新启动。<br />
		error04-其它FTP服务器(也可能是其它应用程序)占用21端口，结束相关占用21端口程序的进程。<br />
		error05-用户名不存在，使用其它用户名登录，或者联系FTP管理员。<br />
		error06-密码错误，尝试其它密码，或者联系FTP管理员。<br />
		error07-[大家添加一些]<br />
		客户端：<br />
		error01-无法连接远程主机，请确认远程主机是否活动，使用ping命令，请确认远程主机是否使用默认端口21<br />
		error02-无法上传文件出错，请确认使用的用户是否具有相应目录的写权限。<br />
		error03-无法下载文件出错，请确认使用的用户是否具有相应的读取权限，以及本地目录是否有写入权限。<br />
		error04-下载过程中出错，请确认网络处于连接状态，并重新下载。<br />
		error05-远程主机关闭，请与远程FTP管理员联系。<br />
		error06-[大家添加一些]</p>
<p>6.2	补救措施</p>
<p>		下载过程中出错(包括文件传输中断，以及文件校验不符)，则重新下载，重试次数3次。</p>
<p>6.3	系统维护设计</p>
<p>	服务端运行时产生详细的运行记录供维护使用，客户端使用-d参数显示详细的服务端返回信息。</p>
<p>附文一：</p>
<p>vsftpd 啟動的模式<br />
vsftpd 可以擁有兩種啟動的方式，分別是一直在監聽的 stand alone ，一種則是透過 xinetd 這個 super daemon 來管理的方式，兩種方式所使用的啟動程序不太相同，而我們的 CentOS 則預設是以 stand alone 來啟動的。 那什麼時候應該選擇 stand alone 或者是 super daemon 呢？如果你的 ftp 伺服器是提供給整個網際網路來進行大量下載的任務，例如各大專院校的 FTP 伺服器，那建議你使用 stand alone 的方式， 服務的速度上會比較好。如果僅是提供給內部人員使用的 FTP 伺服器，那使用 super daemon 來管理即可啊。</p>
<p>附文二：<br />
Tinyftp is a small ftp server. It implements a set of all<br />
the neccessary  commands for performing the main actions,<br />
suppported by the protocol. The server is based on rfc959.<br />
This server does not support "passive" mode, because it needs<br />
a simultaneous communication on a custom free port for<br />
additional data transfers. For this we will need an IPC, which<br />
hardens the implementation a lot.<br />
The only valid user, that can log in is "anonymous", because of<br />
the different authentication mechanism on different platforms.<br />
All server options are set from the command line parameters.</p>
]]></content:encoded>
			<wfw:commentRss>http://cocobear.info/blog/2007/04/06/%e9%a1%b9%e7%9b%ae%e6%96%87%e6%a1%a3-%e6%a6%82%e8%a6%81%e8%ae%be%e8%ae%a1%e8%af%b4%e6%98%8e%e4%b9%a6-v01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
