﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-MemoryGarden's Blog</title><link>http://www.cppblog.com/MemoryGarden/</link><description>努力

                                  -----------大能猫</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 09:37:52 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 09:37:52 GMT</pubDate><ttl>60</ttl><item><title>cocos2d-x 环境概述</title><link>http://www.cppblog.com/MemoryGarden/archive/2012/11/05/194534.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Mon, 05 Nov 2012 00:09:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2012/11/05/194534.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/194534.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2012/11/05/194534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/194534.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/194534.html</trackback:ping><description><![CDATA[环境：<br />&nbsp; &nbsp;XCODE 4，10.8.2<br /><br />安装：<a href="http://www.cocos2d-x.org/" title="官网">官网<br /><br /></a>安装模板：执行 install-templates-xcode.sh 。注意自己xcode 的版本，否则会一直看不到模板，不要启动低版本的xcode。<br /><br />samples 里面有一些相应的工程：<br />HelloCpp -- Hello World 程序，在手机上显示一张图片，一个文字，还有一个按钮开关。<br />TestCpp -- &nbsp;里面基本上显示了cocos2d-x 的引擎提供的效果。<br /><br />个人感受：由于是初步接触此引擎，初步接触游戏引擎，初步接触客户端，基本了解很少，但是看一点他们的源码，还是很简洁，很有想读的欲望。比较吸引我的还是它跨平台的性质，以及c++的代码编写。<br /><br />网络上介绍此引擎的博客有不少，帖两个大家可以去看看。<br /><br /><div>http://blog.csdn.net/column/details/cocos2d-x-study.html?page=2</div><img src ="http://www.cppblog.com/MemoryGarden/aggbug/194534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2012-11-05 08:09 <a href="http://www.cppblog.com/MemoryGarden/archive/2012/11/05/194534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWFupload 利器</title><link>http://www.cppblog.com/MemoryGarden/archive/2012/09/20/191375.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Thu, 20 Sep 2012 04:18:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2012/09/20/191375.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/191375.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2012/09/20/191375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/191375.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/191375.html</trackback:ping><description><![CDATA[转：&nbsp;<a href="http://blog.csdn.net/iamduoluo/article/details/6653733" title="出处">出处<br /><br /><br /><h2>什么是SWFUpload</h2><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">SWFUpload是一个网站前端文件上传组件。SWFUpload通过flash+javascript，实现在不刷新网页的条件下，多个文件批量上传（实际上是逐个上传）、以及显示上传进度。</p><h2><a name="t1" style="color: rgb(202, 0, 0); "></a>SWFUpload基本原理</h2><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong>1、传统的html表单文件上传</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">传统的文件上传是使用下面这种Form的：</p><div "="" id="highlighter_125833" style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>&lt;</code><code>form</code>&nbsp;<code>id</code><code>=</code><code>"file-form"</code>&nbsp;<code>action</code><code>=</code><code>"<a href="http://www.gearcode.com/upload.php" style="color: #ca0000; text-decoration: initial; ">http://www.gearcode.com/upload.php</a>"</code>&nbsp;<code>enctype</code><code>=</code><code>"multipart/form-data"</code>&nbsp;<code>method</code><code>=</code><code>"post"</code><code>&gt;</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>2</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>&lt;</code><code>input</code>&nbsp;<code>name</code><code>=</code><code>"filename"</code>&nbsp;<code>type</code><code>=</code><code>"file"</code>&nbsp;<code>/&gt;</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>3</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>&lt;</code><code>input</code>&nbsp;<code>type</code><code>=</code><code>"submit"</code>&nbsp;<code>value</code><code>=</code><code>"上传"</code>&nbsp;<code>/&gt;</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>4</code></td><td><code>&lt;/</code><code>form</code><code>&gt;</code></td></tr></tbody></table></div></div></div><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">这样的表单，每个input file只能选择一个文件，如果用户想批量上传，则需要使用js动态的向表单中添加&#8220;&lt;input type="file" name="filename"/&gt;&#8221;。用户则需要去点击每一个input file的&#8220;浏览&#8221;按钮，打开选择文件的窗口去逐个选择文件。而不是打开一个能选择多个文件的窗口，一次性的使用ctrl或shift等快捷键选择一个或多个文件。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">而且，当用户选择好文件，点击上传后，表单就会提交出去，至于文件上传的进度如何，上传速度怎样，都不得而知。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong>2、使用SWFUpload后的上传</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">SWFUpload通过向网页中插入一个flash按钮，让用户点击来弹出文件选择的对话框。也就是说，选择文件对话框，是由swfupload.swf中弹出的，当然这需要用户点击这个flash才可以。所以swfupload在初始化时需要设置它显示出来的按钮的样式，例如宽、高、背景色、字体、内间距、图片等等&#8230;&#8230;。除了这些样式，还需要设置按钮显示的位置，以及其他一些配置，这些常用配置在本文的后面会详细介绍。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">因为SWFUpload的选择文件对话框是由flash弹出的，所以这个对话框是可以选择多个文件的。选择好文件以后，swfupload.swf会回调一些javascript函数，将选择文件的一些基本信息作为参数传给这些回调函数，以便开发者通过设置这些回调函数，来改变html从而将这些文件信息显示到页面中。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">在选择好要上传的文件后，这些文件就会被加入到swfupload的上传队列中，一旦调用swfupload实例的&#8220;startUpload()&#8221;函数，swfupload就会通过flash将文件上传到我们指定的地址，这个上传地址也是可以在实例化SWFUpload时设置的，而这个地址则是一个接收文件的action，例如传统文件上传表单中的action="upload.php"。这里需要注意的是，调用startUpload后，swfupload只会将上传文件队列中的第一个未上传的文件提交出去，而不是同时将上传文件队列中所有的文件提交出去，如果在一个文件上传完毕后，再次调用startUpload，swfupload就会开始上传队列中下一个没有上传的文件。所以，如果想实现自动批量上传的话，只需要在上传完成的回调函数中，去调用startUpload就可以了。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">在上传过程中，swfupload会有很多的事件产生，例如上传开始、上传进度变化、上传出错、上传成功、上传完成&#8230;&#8230;我们可以设置这些事件的回调函数，swfupload在发生这些事件的时候，会去调用我们的回调函数，并将相应的信息以参数的形式发送给我们的回调函数。这样我们便可以通过处理这些事件来动态的显示文件上传的状态、进度等信息了。</p><h2><a name="t2" style="color: rgb(202, 0, 0); "></a>开始前的准备</h2><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong>1、获取SWFUpload</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">SWFUpload的官方地址为：<a href="http://www.swfupload.org/" target="_blank" style="color: #ca0000; text-decoration: initial; ">http://www.swfupload.org/</a>，SWFUpload的下载放在了google code上：<a href="http://code.google.com/p/swfupload/downloads/list" target="_blank" style="color: #ca0000; text-decoration: initial; ">http://code.google.com/p/swfupload/downloads/list</a>，此文使用的是：<a href="http://swfupload.googlecode.com/files/SWFUpload%20v2.2.0.1%20Core.zip" style="color: #ca0000; text-decoration: initial; ">SWFUpload v2.2.0.1</a>。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong>2、在线文档</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><a href="http://demo.swfupload.org/Documentation/" target="_blank" style="color: #ca0000; text-decoration: initial; ">http://demo.swfupload.org/Documentation/</a></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong>3、SWFUpload 2.2 的Demos</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><a href="http://demo.swfupload.org/v220/index.htm" target="_blank" style="color: #ca0000; text-decoration: initial; ">http://demo.swfupload.org/v220/index.htm</a></p><h2><a name="t3" style="color: rgb(202, 0, 0); "></a>使用SWFUpload上传文件</h2><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong>1、初始化SWFUpload</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">首先将下载下来的&#8220;<a href="http://swfupload.googlecode.com/files/SWFUpload%20v2.2.0.1%20Core.zip" style="color: #ca0000; text-decoration: initial; ">SWFUpload v2.2.0.1 Core</a>&#8221;压缩包解压，会得到一个swfupload.js、以及一个swfupload.swf（在Flash目录中），将这两个文件copy到你的项目中。压缩包中还会有一些其他的文件，例如英文的文档、ChangeLog、License等文件，不在本文讨论范围内，实际应用时也无需导入到你的项目中。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">在使用SWFUpload上传组件的页面引入swfupload.js：</p><div "="" id="highlighter_281761" style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>&lt;</code><code>script</code>&nbsp;<code>type</code><code>=</code><code>"text/javascript"</code>&nbsp;<code>src</code><code>=</code><code>"<a href="http://www.gearcode.com/lib/swfupload/swfupload.js" style="color: #ca0000; text-decoration: initial; ">http://www.gearcode.com/lib/swfupload/swfupload.js</a>"</code>&nbsp;<code>type</code><code>=</code><code>"text/javascript"</code><code>&gt;&lt;/</code><code>script</code><code>&gt;</code></td></tr></tbody></table></div></div></div><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">这个swfupload.js是SWFUpload组件提供的一个javascript类库，是用来初始化及设置swfupload.swf的。其中有一个名为&#8220;SWFUpload&#8221;的function，我们通过创建这个function的实例来初始化SWFUpload，同时传入一些初始化配置信息。需要注意的是，一定要在网页加载完成后再去new这个SWFUpload，因为swfupload.swf是通过替换掉页面中的一个html元素来确定自己显示出来的位置的。所以如果在这个html元素还没被创建出来的时候，就去实例化SWFUpload的话，就会出现javascript错误。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">实例化SWFUpload，并设置初始化参数：</p><div "="" id="highlighter_910802" style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><div><div alt1"=""><table><tbody><tr><td><code>01</code></td><td><code>var</code>&nbsp;<code>swfu;</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>02</code></td><td><code>// 这里使用了JQuery，在body onload后，也就是网页加载完成后，实例化SWFUpload。</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>03</code></td><td><code>$(</code><code>function</code><code>(){</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>04</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>swfu =&nbsp;</code><code>new</code>&nbsp;<code>SWFUpload(config == undefined ? {</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>05</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>upload_url : path+</code><code>"/fileUpload.action"</code><code>,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>06</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>flash_url : path+</code><code>"/plugin/uploader/SWFUpload/swfupload.swf"</code><code>,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>07</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>file_size_limit :&nbsp;</code><code>"20 KB"</code><code>,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>08</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>file_types :&nbsp;</code><code>"*.jpg;*.jpeg;*.png;*.bmp;*.gif"</code><code>,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>09</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>file_types_description :&nbsp;</code><code>"All Image Files"</code><code>,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>10</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>file_post_name :&nbsp;</code><code>"fileQueue"</code><code>,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>11</code></td><td>&nbsp;</td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>12</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>button_placeholder_id :&nbsp;</code><code>"spanSWFUploadButton"</code><code>,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>13</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>button_width : 60,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>14</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>button_height : 20,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>15</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>button_text :&nbsp;</code><code>"&lt;b&gt;添加文件&lt;/b&gt;"</code><code>,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>16</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>button_text_left_padding : 3,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>17</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>button_text_top_padding : 2,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>18</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>button_cursor : SWFUpload.CURSOR.HAND,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>19</code></td><td>&nbsp;</td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>20</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>//handler</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>21</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>file_queued_handler : Handler.fileQueued,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>22</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>file_queue_error_handler : Handler.fileQueueError,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>23</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>upload_complete_handler : Handler.uploadComplete,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>24</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>upload_start_handler : Handler.uploadStart,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>25</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>upload_progress_handler : Handler.uploadProgress,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>26</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>upload_success_handler : Handler.uploadSuccess</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>27</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>});</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>28</code></td><td><code>});</code></td></tr></tbody></table></div></div></div><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">通过上面的代码可以创建一个SWFUpload的实例&#8220;swfu&#8221;，后面对文件队列的操作都需要通过调用这个实例的方法来完成。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">初始化参数中&#8220;button_placeholder_id&#8221;为页面上的一个html节点的ID，成功初始化SWFUpload后，会将此节点替换为swfupload.swf。其他以&#8220;button_&#8221;开头的参数都是用来设置swfupload.swf的显示样式的。大部分初始化参数非常简单，这里不一一赘述，用户可以查阅前面提到的<a href="http://demo.swfupload.org/Documentation/" style="color: #ca0000; text-decoration: initial; ">SWFUpload的在线文档</a>。这里有一点需要注意，初始化SWFUpload后，页面上对应的html节点被替换为我们设置的flash按钮，但如果你的页面不是以http协议打开的，点击这个按钮是不会弹出选择文件对话框的。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">例如，我直接在桌面上的文件夹中打开页面：</p><blockquote style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><p style="margin: 0px; padding: 0px; ">file:///C:/Documents and Settings/JasonLee/桌面/upload/upload.html</p></blockquote><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">以这样的方式打开页面，点击flash按钮是不会弹出选择文件对话框的。所以测试的时候要将页面上传部署到服务器上，以http协议打开，例如：</p><blockquote style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><p style="margin: 0px; padding: 0px; ">http://www.gearcode.com/demo/file-upload/upload.html</p></blockquote><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong>2、开始上传</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">完成初始化以后，点击flash上传按钮便会打开选择文件对话框。选择好文件后，对话框关闭，被选择的文件将进入上传队列。如果要开始上传，只需要调用SWFUpload的startUpload函数即可，例如：</p><div "="" id="highlighter_855141" style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>swfu.startUpload();</code></td></tr></tbody></table></div></div></div><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">但是如果队列中有多个文件，调用startUpload()后只会上传第一个未上传的文件，所以前面提到了，SWFUpload的批量上传实际上就是自动逐个上传文件。如果要实现自动批量上传只需要在上传文件成功后，再次调用开始上传方法。我们可以通过设置SWFUpload的handler函数来实现：</p><div "="" id="highlighter_415790" style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>upload_complete_handler:&nbsp;</code><code>function</code><code>(file) {</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>2</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>this</code><code>.startUpload();</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>3</code></td><td><code>}</code></td></tr></tbody></table></div></div></div><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong>3、handler函数</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">SWFUpload在工作的过程中，会产生很多事件。这些事件对我们来说有很多用处（例如想在页面中显示文件大小、上传进度、速度等信息），我们可以设置handler函数来监控这些事件，当SWFUpload触发这些事件时，会主动调用我们设置的回调函数，并将文件信息作为参数传递给我们的回调函数。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">SWFUpload的handler函数有很多，这里只介绍以下6个常用的事件回调函数：</p><table border="1" cellpadding="1" cellspacing="1" style="color: #000000; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; background-color: #ffffff; "><thead><tr><th scope="col">事件名称</th><th scope="col">初始化参数名称</th><th scope="col">参数</th><th scope="col">事件触发</th></tr></thead><tbody><tr><td>fileQueued</td><td>file_queued_handler</td><td>file</td><td>每个文件进入上传队列时触发</td></tr><tr><td>fileQueueError</td><td>file_queue_error_handler</td><td>file, errorCode, message</td><td>每个文件进入上传队列时，如果出错则触发</td></tr><tr><td>uploadStart</td><td>upload_start_handler</td><td>file</td><td>每个文件开始上传时触发</td></tr><tr><td>uploadProgress</td><td>upload_progress_handler</td><td>file, bytesLoaded, bytesTotal</td><td>每个文件的上传进度发生改变时触发</td></tr><tr><td>uploadSuccess</td><td>upload_success_handler</td><td>file, serverData</td><td>每个文件上传成功后触发</td></tr><tr><td>uploadComplete</td><td>upload_complete_handler</td><td>file</td><td>每个文件上传完毕后触发</td></tr></tbody></table><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">例如我需要监听uploadProgress事件，则需要在SWFUpload初始化时，设置upload_progress_handler参数的值：</p><div "="" id="highlighter_272627" style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>swfu =&nbsp;</code><code>new</code>&nbsp;<code>SWFUpload({</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>2</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>//省略其他初始化参数...</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>3</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>upload_progress_handler: uploadProgress</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>4</code></td><td><code>});</code></td></tr></tbody></table></div></div></div><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">然后再建立监听事件的回调函数：</p><div "="" id="highlighter_99722" style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>function</code>&nbsp;<code>uploadProgress(file, bytesLoaded, bytesTotal) {</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>2</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>//...</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>3</code></td><td><code>}</code></td></tr></tbody></table></div></div></div><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">这样，在文件上传时，每次上传进度发生改变，都会调用uploadProgress这个函数，并且将文件的信息、已经上传的字节数、文件的总字节数发送给回调函数。</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">其他的回调函数使用方法都一样，这里就不一一介绍了，最后介绍一下回调函数的参数file。几乎所有的回调函数都会将file作为参数，file是一个javascript对象，其结构如下（来自官方的在线文档）：</p><blockquote style="color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; "><p style="margin: 0px; padding: 0px; ">{<br />&nbsp;&nbsp;&nbsp; id : string,<br />&nbsp;&nbsp; &nbsp;index : number,<br />&nbsp;&nbsp; &nbsp;name : string,<br />&nbsp;&nbsp; &nbsp;size : number,<br />&nbsp;&nbsp; &nbsp;type : string,<br />&nbsp;&nbsp; &nbsp;creationdate : Date,<br />&nbsp;&nbsp; &nbsp;modificationdate : Date,<br />&nbsp;&nbsp; &nbsp;filestatus : number,<br />}</p></blockquote><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; line-height: 26px; background-color: #ffffff; ">下面是file对象中的每个属性的简单说明：</p><table border="1" cellpadding="1" cellspacing="1" style="color: #000000; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; background-color: #ffffff; "><thead><tr><th scope="col">属性名</th><th scope="col">类型</th><th scope="col">说明</th></tr></thead><tbody><tr><td>id</td><td>string</td><td>SWFUpload为队列中的文件生成的ID</td></tr><tr><td>index</td><td>number</td><td>文件的索引值，使用getFile(index)可以获取该文件</td></tr><tr><td>name</td><td>string</td><td>原文件名，不包含原文件目录</td></tr><tr><td>size</td><td>number</td><td>文件的尺寸，单位：byte</td></tr><tr><td>type</td><td>string</td><td>文件类型</td></tr><tr><td>creationdate</td><td>Date</td><td>文件的创建时间</td></tr><tr><td>modificationdate</td><td>Date</td><td>文件的最后修改时间</td></tr><tr><td>filestatus</td><td>number</td><td>文件在上传队列中的状态，可以使用SWFUpload.FILE_STATUS比较值<br /><br /></td></tr></tbody></table></a><img src ="http://www.cppblog.com/MemoryGarden/aggbug/191375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2012-09-20 12:18 <a href="http://www.cppblog.com/MemoryGarden/archive/2012/09/20/191375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义事件</title><link>http://www.cppblog.com/MemoryGarden/archive/2012/09/16/190891.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sun, 16 Sep 2012 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2012/09/16/190891.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/190891.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2012/09/16/190891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/190891.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/190891.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/MemoryGarden/archive/2012/09/16/190891.html'>阅读全文</a><img src ="http://www.cppblog.com/MemoryGarden/aggbug/190891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2012-09-16 17:24 <a href="http://www.cppblog.com/MemoryGarden/archive/2012/09/16/190891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP端口号与并发服务器</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/07/05/150164.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Mon, 04 Jul 2011 19:00:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/07/05/150164.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/150164.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/07/05/150164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/150164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/150164.html</trackback:ping><description><![CDATA[背景 ： 并发服务器中，主服务循环通过派生一个子进程来处理每个新的连接，如果一个子进程继续使用服务器众所周知的端口来服务一个长时间的请求，那将会发生什么？<br />首先，在一台 IP地址为 10.2.16.48 的服务器，服务器在端口21上执行被动打开(socket,bind,listen) 等待客户请求。<br />服务器 ： {*：21，*：*} 之处服务器的套接字对，服务器在本地端口21上等待连接，外地IP地址和端口都没有指定，用 "*:*" 来表示<br /><br />稍后，IP地址为 10.22.206.157 的主机上启动第一个客户，它对服务器10.2.16.48 执行主动打开(connect) 假设客户主机的TCP为此选择临时端口为1500，当服务器接收到这个客户的连接的时候，服务器fork一个自身的副本，让子进程来处理该客户的请求<br /><br />至此，我们必须在服务器上区分监听套接字和已经连接的套接字，监听套接字与已连接的套接字使用共同的端口21。<br />下一步，我们假设在客户主机上有另外一个客户请求连接到同一台服务器，客户主机的TCP为这个客户的套接字分配一个未使用的端口，1501。<br /><br />对于服务器来说，这两个连接是有区别的，第一个连接的套接字对{10.22.206.157:1500,10.2.16.48:21} 和第二个连接的套接字对 {10.22.206.157:1501,10.2.16.48:21} 不一样，因为客户的TCP为第二个连接选择了一个未使用的端口 1501<br /><br />通过本例应该注意，TCP无法仅仅通过查看目的端口号来分离外来的分节到不同的端点，它必须通过查看套接字对的所有4个元素才能确定由哪个端点接收某个到达的分节。如上例，对于同一个本地端口21来说，存在3个套接字，如果一个分节来自 10.22.206.157:1500 目的地为 10.2.16.48:21 它就被递送给第一个子进程，如果一个分节来自 10.22.206.157:1501 目的地为 10.2.16.48:21 它就被递送给第二个子进程。所有目的端口为21的其他TCP分节，都被递送给拥有监听套接字的最初的父进程<br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/150164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-07-05 03:00 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/07/05/150164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>套接字对</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/07/04/150066.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sun, 03 Jul 2011 16:44:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/07/04/150066.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/150066.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/07/04/150066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/150066.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/150066.html</trackback:ping><description><![CDATA[一个TCP连接的套接字对(socket pair) 是一个定义该连接的两个端点的四元组：本地IP地址、本地TCP端口号、外地IP地址，外地TCP端口号。套接字对唯一标识网络的一个TCP连接。标识每个端点的两个值(IP和端口号) 通常成为一个 套接字<br /><br />ps: 好短....<img src ="http://www.cppblog.com/MemoryGarden/aggbug/150066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-07-04 00:44 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/07/04/150066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP连接的建立和终止</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/07/02/150007.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sat, 02 Jul 2011 14:23:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/07/02/150007.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/150007.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/07/02/150007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/150007.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/150007.html</trackback:ping><description><![CDATA[建立一个TCP连接时，会发生下述情形：<br /><br />1、服务器端必须做好准备接受外来的连接。这通常通过 socket(), bind(), listen() 三个函数来完成的。我们称之为 被动打开(passive open).<br /><br /><br />2、客户端通过调用connect发起主动打开(active open)。这导致客户端TCP发送SYN同步分节。它告诉服务器客户端在(待建立的)连接中发送的数据的初始化序列号。通用SYN分节不携带数据，<br />3、服务器必须确认(ACK) 客户端的SYN，同时自己也得发送一个SYN分节，它含有服务器将在统一连接中发送的数据的初始化序号。服务器在单个分节中发送SYN和对客户端SYN的ACK确认。<br />4、客户端必须确认服务器的SYN。<br /><br />TCP连接的终止：<br />1、某个应用程序首先调用close，主动关闭(active close) 该端的TCP于是发送一个FIN分节，表示数据发送完毕。<br />2、接收到这个FIN的对端执行被动关闭(passive close)。这个FIN是TCP确认。它的接收也作为一个文件结束符(end of file) 传递给接收端的应用程序(放在排队等候应用进程接收的任何其他数据之后)，因为FIN的接收意味着接收端应用程序在相应连接上再无额外数据可以接收。<br />3、一段时间以后，接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。<br />4、接收这个最终FINd额原发送端TCP(即执行主动关闭的一端)确认这个FIN<br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/150007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-07-02 22:23 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/07/02/150007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket gethostbyname</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149217.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149217.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149217.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149217.html</trackback:ping><description><![CDATA[struct hostent* gethostbyname(const char* name);<br /><br />struct hostent 是这样定义的：<br /><br />struct hostent{<br />&nbsp;&nbsp; char* h_name;<br />&nbsp;&nbsp; char **h_aliases;<br />&nbsp;&nbsp; int h_addrtype;<br />&nbsp;&nbsp; int h_length;<br />&nbsp;&nbsp; char **h_addr_list;<br />};<br /><br />解释 ：<br />&nbsp;&nbsp; h_name : 是这个主机的正式名称。<br />&nbsp;&nbsp; h_aliases : 是一个以NULL为结尾的数组，里面存储了主机的备用名称。<br />&nbsp;&nbsp; h_addr_type : 是返回地址的类型，一般来说是 "AF_INET"<br />&nbsp;&nbsp; int h_length&nbsp; ： 是地址的字节长度<br />&nbsp;&nbsp; h_addr_list ： 是一个以0为结尾的数组，存储了主机的网络地址(以网络字节序存储)<br /><br />&nbsp;&nbsp; <br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 23:24 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket gethostname</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149215.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 15:14:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149215.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149215.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149215.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149215.html</trackback:ping><description><![CDATA[gethostname 可以取得本地主机的信息。<br /><br />返回正在执行它的计算机的名字<br /><br />int gethostname(char* hostname, size_t size);<br />参数：<br />&nbsp;&nbsp; hostname :&nbsp; 指向字符数组的指针，当函数返回的时候，它里面的数据就是本地主机的名字。<br />&nbsp;&nbsp; size : 是hostname 只想数组的长度。<br /><br />返回值<br />&nbsp;&nbsp; －1 出错 errno 全局变量存储出错信息。<br />&nbsp;&nbsp; 0 成功。<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 23:14 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket getpeername</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149214.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149214.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149214.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149214.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149214.html</trackback:ping><description><![CDATA[这个函数可以取得一个已经连接上的套接字的远程信息(例如 ip, port) 告诉你在远程和你连接的究竟是谁。<br /><br />int getpeername(int sockfd, struct sockaddr* addr, int *addrlen);<br />参数：<br />&nbsp;&nbsp; sockfd 是你想取得远程信息的那个套接字描述符<br />&nbsp;&nbsp; addr 是一个指向 struct sockaddr 或者是 struct sockaddr_in 的指针。<br />&nbsp;&nbsp; addrlen : 是一个指向int的指针，应该赋予 sizeof(struct sockadd) 的大小<br />返回值：<br />&nbsp;&nbsp; －1，出错，全局变量 errno 中存储错误代码。<br />&nbsp;&nbsp; <img src ="http://www.cppblog.com/MemoryGarden/aggbug/149214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 23:10 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket getsockopt setsockopt</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149213.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 15:03:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149213.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149213.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149213.html</trackback:ping><description><![CDATA[int getsockopt (int sockfd, int level, int name, char* value, int* optlen);<br />int setsockopt (int sockfd, int level, int name, char* value, int* optlen);<br /><br />参数：<br />&nbsp;&nbsp; sockfd : 必须是一个已经打开的套接字<br />&nbsp;&nbsp; level : 是函数所使用的协议标准(protocol level) (TCP/IP 协议使用 IPPROTO_TCP, 套接字标准的选项使用 SOL_SOCKET)。<br />&nbsp;&nbsp; name : <br />&nbsp;&nbsp; value : 指向为 getsockopt()函数所获取的值。 setsockopt 所设置的值的地址。<br />&nbsp;&nbsp; <br />linux 系统所提供的socket库有一个bug,次错误表现为你不能为一个套接字重新启用一个端口号，即使在你正常关闭一个套接字以后。例如，你编写一个服务器在套接字上等待的一个程序，服务器打开套接字，并在其上侦听，是没有问题的，无论如何，总有一些原因，使你的程序需要重新启动，然后重新启动后，就不能把它绑定在原来的那个端口上了，从bind 系统调用返回代码总是说你试图连接的端口已经被别的进程所绑定。问题在于linux内核在一个绑定套接字的进程结束后，从不把端口标记为未用，解决这个问题的办法是，当套接字打开，但尚未有连接的时候，用setsockopt系统调用，设定如下选项<br /><br />当打开一个socket套接字的时候，必须同时用下面的代码段来调用setsockopt 函数<br /><br />&nbsp;&nbsp; int opt = 1;<br />&nbsp;&nbsp; int len = sizeof(opt)<br />&nbsp;&nbsp; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &amp;opt, &amp;len)<br /><br /> SO_REUSEADDR 选项将套接口设置成重新使用旧的地址(ip和port)，而不等待<br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 23:03 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>