﻿<?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++博客-Khan's Notebook    GCC/GNU/Linux Delphi/Window Java/Anywhere-随笔分类-跨平台开发</title><link>http://www.cppblog.com/Khan/category/775.html</link><description>路漫漫，长修远，我们不能没有钱</description><language>zh-cn</language><lastBuildDate>Wed, 20 Oct 2021 16:50:31 GMT</lastBuildDate><pubDate>Wed, 20 Oct 2021 16:50:31 GMT</pubDate><ttl>60</ttl><item><title>QtCreator中如何使用Conan包管理工具</title><link>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 19 Oct 2021 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/217838.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/217838.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/217838.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要点    Conan本身是一个包管理工具, 类似Pyhon的pip, 本身用Python编写    QT 6.0 开始引入Conan插件, 从个人观察来看, 似乎该插件仅仅引入了cmake脚本文件    Conan本身不依赖QtCreator, 可以随意使用, 其他编译环境可以忽略掉本文章所有关于QT的内容, 其他不变一 准备环境, 安装Conan1.1 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2021/10/19/217838.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/217838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2021-10-19 16:09 <a href="http://www.cppblog.com/Khan/archive/2021/10/19/217838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 和 windows下 获取主机网卡mac地址</title><link>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 03 Jun 2021 09:42:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/217702.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/217702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/217702.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #000000">#ifndef&nbsp;__EHTERNET_HPP__<br /></span><span style="color: #008080">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;__EHTERNET_HPP__</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(WIN32)&nbsp;||&nbsp;defined(_WIN32)&nbsp;||&nbsp;defined(__WIN32__)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;MY_WIN32</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#elif</span><span style="color: #000000">&nbsp;defined(linux)&nbsp;||&nbsp;defined(__linux)&nbsp;||&nbsp;defined(__linux__)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;MY_LINUX</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;10</span>&nbsp;<span style="color: #000000">#include</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;11</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;12</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_WIN32)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;13</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">winsock2.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;14</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iphlpapi.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;15</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;16</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;17</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_LINUX)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;18</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">socket.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;19</span>&nbsp;<span style="color: #000000"></span><span style="color: #008000">//</span><span style="color: #008000">#include&nbsp;&lt;linux/if.h&gt;<br /></span><span style="color: #008080">&nbsp;20</span>&nbsp;<span style="color: #008000"></span><span style="color: #008000">//</span><span style="color: #008000">#include&nbsp;&lt;net/if.h&gt;</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;21</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">ioctl.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;22</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;23</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;24</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_WIN32)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;25</span>&nbsp;<span style="color: #000000">std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;operstatusToStr(IF_OPER_STATUS&nbsp;status){<br /></span><span style="color: #008080">&nbsp;26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">(status){<br /></span><span style="color: #008080">&nbsp;27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusUp:<br /></span><span style="color: #008080">&nbsp;28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">up</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusDown:<br /></span><span style="color: #008080">&nbsp;30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">down</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusTesting:<br /></span><span style="color: #008080">&nbsp;32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">testing</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusUnknown:<br /></span><span style="color: #008080">&nbsp;34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusDormant:<br /></span><span style="color: #008080">&nbsp;36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">dormant</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusNotPresent:<br /></span><span style="color: #008080">&nbsp;38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">notPresent</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusLowerLayerDown:<br /></span><span style="color: #008080">&nbsp;40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">sLowerLayerDown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;43</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">&nbsp;44</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;45</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetMacByGetAdaptersAddresses(std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;macOUT,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">&nbsp;46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;47</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;family&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;AF_UNSPEC;</span><span style="color: #008000">//</span><span style="color: #008000">返回包括&nbsp;IPV4&nbsp;和&nbsp;IPV6&nbsp;地址</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;49</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;flags&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GAA_FLAG_INCLUDE_PREFIX&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;GAA_FLAG_INCLUDE_GATEWAYS;</span><span style="color: #008000">//</span><span style="color: #008000">包括&nbsp;IPV4&nbsp;，IPV6&nbsp;閘道器</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;50</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;outBufLen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(IP_ADAPTER_ADDRESSES)&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PIP_ADAPTER_ADDRESSES&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;52</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PIP_ADAPTER_ADDRESSES&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;54</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwRetVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">&nbsp;57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(IP_ADAPTER_ADDRESSES&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)malloc(outBufLen);<br /></span><span style="color: #008080">&nbsp;58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pAddresses&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br /></span><span style="color: #008080">&nbsp;59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ret;<br /></span><span style="color: #008080">&nbsp;60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwRetVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetAdaptersAddresses(family,&nbsp;flags,&nbsp;NULL,&nbsp;pAddresses,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">outBufLen);<br /></span><span style="color: #008080">&nbsp;61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ERROR_BUFFER_OVERFLOW)&nbsp;{<br /></span><span style="color: #008080">&nbsp;62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(pAddresses);<br /></span><span style="color: #008080">&nbsp;63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">&nbsp;65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ERROR_BUFFER_OVERFLOW);<br /></span><span style="color: #008080">&nbsp;68</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;69</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NO_ERROR)&nbsp;{<br /></span><span style="color: #008080">&nbsp;70</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pAddresses;<br /></span><span style="color: #008080">&nbsp;71</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(pCurrAddresses)&nbsp;{<br /></span><span style="color: #008080">&nbsp;72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddressLength&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">&nbsp;73</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(all&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OperStatus&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;IfOperStatusUp){<br /></span><span style="color: #008080">&nbsp;74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;type[</span><span style="color: #000000">8</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #000000">0</span><span style="color: #000000">};<br /></span><span style="color: #008080">&nbsp;75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">&nbsp;(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">IfType){&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">网卡类型</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;76</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_ETHERNET:<br /></span><span style="color: #008080">&nbsp;77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">eth</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;78</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;79</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_PPP:<br /></span><span style="color: #008080">&nbsp;80</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ppp</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;81</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;82</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_LOOPBACK:<br /></span><span style="color: #008080">&nbsp;83</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">loop</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;84</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;85</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_SLIP:<br /></span><span style="color: #008080">&nbsp;86</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">atm</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;87</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;88</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IF_TYPE_IEEE80211:<br /></span><span style="color: #008080">&nbsp;89</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">wifi</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;90</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;91</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;92</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;93</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;acMAC[</span><span style="color: #000000">32</span><span style="color: #000000">];<br /></span><span style="color: #008080">&nbsp;94</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(acMAC,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">%02X%02X%02X%02X%02X%02X</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">0</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">1</span><span style="color: #000000">]),<br /></span><span style="color: #008080">&nbsp;95</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">2</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">3</span><span style="color: #000000">]),<br /></span><span style="color: #008080">&nbsp;96</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">4</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">5</span><span style="color: #000000">]));<br /></span><span style="color: #008080">&nbsp;97</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;macOUT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;macOUT&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;acMAC&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;98</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;99</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">100</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">101</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">102</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Next;<br /></span><span style="color: #008080">103</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">104</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">105</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">106</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">107</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">108</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">109</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pAddresses)&nbsp;free(pAddresses);<br /></span><span style="color: #008080">110</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ret;<br /></span><span style="color: #008080">111</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">112</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">113</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">114</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_LINUX)</span><span style="color: #000000"><br /></span><span style="color: #008080">115</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetMacByGetAdaptersAddresses(std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;macOUT,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">){<br /></span><span style="color: #008080">116</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sock,&nbsp;if_count,&nbsp;i;<br /></span><span style="color: #008080">117</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifconf&nbsp;ifc;<br /></span><span style="color: #008080">118</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq&nbsp;ifr[</span><span style="color: #000000">10</span><span style="color: #000000">];<br /></span><span style="color: #008080">119</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;mac[</span><span style="color: #000000">32</span><span style="color: #000000">];<br /></span><span style="color: #008080">120</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">121</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifc,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifconf));<br /></span><span style="color: #008080">122</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;socket(AF_INET,&nbsp;SOCK_DGRAM,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br /></span><span style="color: #008080">123</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">124</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ifc.ifc_len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq);<br /></span><span style="color: #008080">125</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ifc.ifc_buf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)ifr;<br /></span><span style="color: #008080">126</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">127</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取所有网卡信息</span><span style="color: #008000"><br /></span><span style="color: #008080">128</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ioctl(sock,&nbsp;SIOCGIFCONF,&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifc);<br /></span><span style="color: #008080">129</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;if_count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ifc.ifc_len&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq));<br /></span><span style="color: #008080">130</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;if_count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">131</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ioctl(sock,&nbsp;SIOCGIFHWADDR,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifr[i])&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">132</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(all&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;(ifr[i].ifr_flags&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;IFF_RUNNING)&nbsp;){<br /></span><span style="color: #008080">133</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(mac,&nbsp;ifr[i].ifr_hwaddr.sa_data,&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">);<br /></span><span style="color: #008080">134</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(mac,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">%02X%02X%02X%02X%02X%02X</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">0</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">1</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">2</span><span style="color: #000000">]),<br /></span><span style="color: #008080">135</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">3</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">4</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">5</span><span style="color: #000000">]));<br /></span><span style="color: #008080">136</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;macOUT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;macOUT&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;mac&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">;<br /></span><span style="color: #008080">137</span>&nbsp;<span style="color: #000000"></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("eth:&nbsp;%s,&nbsp;mac:&nbsp;%02x:%02x:%02x:%02x:%02x:%02x\n",&nbsp;ifr[i].ifr_name,&nbsp;mac[0],&nbsp;mac[1],&nbsp;mac[2],&nbsp;mac[3],&nbsp;mac[4],&nbsp;mac[5]);</span><span style="color: #008000"><br /></span><span style="color: #008080">138</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">139</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">140</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">141</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">142</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">143</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">144</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">145</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">146</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">147</span>&nbsp;<span style="color: #000000"></span></div><br />调用方式<br /><br /><span style="color: #c0c0c0">&nbsp;&nbsp;&nbsp; </span><span style="color: #800080">std</span>::<span style="color: #800080">string</span><span style="color: #c0c0c0"> </span><span style="color: #092e64">macs</span>;<pre style="margin: 0px; text-indent: 0px; -qt-block-indent: 0"><span style="color: #c0c0c0">    </span><span style="color: #00677c">GetMacByGetAdaptersAddresses</span>(<span style="color: #092e64; font-style: italic">macs</span>,<span style="color: #c0c0c0"> </span><span style="color: #808000">true</span>);</pre><pre style="margin: 0px; text-indent: 0px; -qt-block-indent: 0"><span style="color: #c0c0c0">    </span><span style="color: #000080">qDebug</span>()<span style="color: #c0c0c0"> </span><span style="color: #00677c">&lt;&lt;</span><span style="color: #c0c0c0"> </span><span style="color: #000080">TIMESTAMP</span><span style="color: #c0c0c0"> </span><span style="color: #00677c">&lt;&lt;</span><span style="color: #c0c0c0"> </span><span style="color: #092e64">macs</span>.<span style="color: #00677c">c_str</span>();</pre><br /><br /><br /><img src ="http://www.cppblog.com/Khan/aggbug/217702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2021-06-03 17:42 <a href="http://www.cppblog.com/Khan/archive/2021/06/03/217702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 C++ 中实现一个轻量的标记清除 gc 系统(转载)</title><link>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 01 Aug 2019 02:57:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/216620.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/216620.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/216620.html</trackback:ping><description><![CDATA[<div># 在 C++ 中实现一个轻量的标记清除 gc 系统<br /></div><div></div><div>[引用](https://blog.codingnow.com/2010/02/cpp_gc.html)<br /></div><div></div><div></div><div>最近想把 engine 做一个简单 C++ 封装，结合 QT 使用。engine 本身是用纯 C 实现的，大部分应用基于 lua 开发。对对象生命期管理也依赖 lua 的 gc 系统。关于这部分的设计，可以参考我以前写的一篇 为 lua 封装 C 对象的生存期管理问题 。<br /></div><div></div><div>当我们把中间层搬到 C++ 中时，遇到的问题之一就是，C++ 没有原生的 gc 支持。我也曾经写过一个 gc 库。但在特定应用下还不够简洁。这几天过年休息，仔细考虑了一下相关的需求，尝试实现了一个更简单的 gc 框架。不到 200 行代码吧，我直接列在这篇 blog 里。<br /></div><div></div><div>这些尚是一些玩具代码，我花了一天时间来写。有许多考虑不周的地方，以及不完整的功能。但可以阐明一些基本思路。<br /></div><div></div><div>首先我需要一个`标记清除`的 `gc系统`，用来解决`引用记数`不容易解决的`循环引用`问题。它的实现不想比`引用记数`复杂太多，并有相同甚至更高的性能。<br /></div><div></div><div>我不想使用复杂的 template 技术，利用太多的语法糖让使用看起来简单。如果需要让这些 C++ 代码看起来更现代，更有&#8220;品味&#8221;，我想也不是很难的事情。<br /></div><div></div><div>接口和实现希望尽量分离，对用的人少暴露细节。但不拘泥于教条，强求做成类似 COM 那样的通用 ABI 。还是尽量利用 C++ 语言本身提供的机制，不滥用。<br /></div><div></div><div>使用尽量简单，不要让使用人员有太大负担。<br /></div><div></div><div>功能满足最低需求即可。代码容易阅读，使用人员可以很快理解原理，不至于误用。也方便日后扩展以适应新的需求。<br /></div><div></div><div>代码如下：</div><div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;filename:&nbsp;i_gcobject.h&nbsp;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.&nbsp;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"&nbsp;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;as&nbsp;listed&nbsp;at&nbsp;.&nbsp;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;#ifndef&nbsp;interfacce_gcobject_h&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcobject_h&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interface&nbsp;struct&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcobject&nbsp;{&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~i_gcobject()&nbsp;{}&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{}&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;collect();&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;};&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div><div><br /></div><div>所有支持 `gc管理的接口`都继承至 `i_gcobject` ，提供三个方法:<br /></div><div></div><div>* mark 可以把这个对象打上标记，被标记的对象将不会被 collect 回收。</div><div></div><div>* grab 将对象挂接到一个被称呼为 root 的特殊 gcobject 上。</div><div></div><div>* release 将对象从 root 上取掉。<br /></div><div></div><div>另提供 touch 的模板方法供 mark 回调，用来标记同一对象中的不同部分。</div><div></div><div>mark 方法一般在 touch 方法中使用，另外，collect 方法将主动调用 root 的 mark 。<br /></div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;i_gcholder.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;interfacce_gcholder_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcholder_h<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;"i_gcobject.h"<br /><span style="color: #008080; ">15</span>&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcholder&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;hold(i_gcobject&nbsp;*)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unhold(i_gcobject&nbsp;*)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_gcholder&nbsp;*&nbsp;create();<br /><span style="color: #008080; ">21</span>&nbsp;};<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div></div><div></div><div></div><div>`i_gcholder` 为 root 的接口，提供 `hold` 和 `unhold` 方法来挂接需要持久保留的 gcobject 。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;i_gcobject.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;interfacce_gcobject_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcobject_h<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interface&nbsp;struct<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~i_gcobject()&nbsp;{}<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{}<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;collect();<br /><span style="color: #008080; ">26</span>&nbsp;};<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div></div><div></div><div></div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcobject.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;gc_object_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;gc_object_h<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;"i_gcobject.h"<br /><span style="color: #008080; ">15</span>&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;gcobject&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;marked;<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;gcobject();<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark();<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab();<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release();<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_unmarked;<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;};<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000FF; ">#endif</span><br /><span style="color: #008080; ">30</span>&nbsp;```<br /><span style="color: #008080; ">31</span>&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;```c++<br /><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcobject.cpp&nbsp;<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">44</span>&nbsp;#include&nbsp;"i_gcholder.h"<br /><span style="color: #008080; ">45</span>&nbsp;#include&nbsp;&lt;vector&gt;<br /><span style="color: #008080; ">46</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;gc_trigger;<br /><span style="color: #008080; ">49</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;std::vector&lt;gcobject&nbsp;*&gt;&nbsp;gc_pool;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_gcholder&nbsp;*&nbsp;gc_root&nbsp;=&nbsp;i_gcholder::create();<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;<br /><span style="color: #008080; ">53</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;gcobject::f_unmarked&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(gcobject&nbsp;*&nbsp;value)&nbsp;{<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;unmarked&nbsp;=&nbsp;value-&gt;marked&nbsp;!=&nbsp;gc_trigger;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(unmarked)&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;value;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;unmarked;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;};<br /><span style="color: #008080; ">62</span>&nbsp;<br /><span style="color: #008080; ">63</span>&nbsp;gcobject::gcobject()&nbsp;:&nbsp;marked(!gc_trigger)&nbsp;{<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;gc_pool.push_back(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">65</span>&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;<br /><span style="color: #008080; ">67</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::mark()&nbsp;{<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(marked&nbsp;!=&nbsp;gc_trigger)&nbsp;{<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;marked&nbsp;=&nbsp;gc_trigger;<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touch();<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">72</span>&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;<br /><span style="color: #008080; ">74</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::grab(){<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;hold(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">76</span>&nbsp;}<br /><span style="color: #008080; ">77</span>&nbsp;<br /><span style="color: #008080; ">78</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::release(){<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;unhold(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">80</span>&nbsp;}<br /><span style="color: #008080; ">81</span>&nbsp;<br /><span style="color: #008080; ">82</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;i_gcobject::collect()&nbsp;{<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;mark();<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;gc_pool.erase(remove_if(gc_pool.begin(),&nbsp;gc_pool.end()&nbsp;,&nbsp;gcobject::f_unmarked()),&nbsp;gc_pool.end());<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;gc_trigger&nbsp;=&nbsp;!gc_trigger;<br /><span style="color: #008080; ">86</span>&nbsp;}</div></div><div></div><div></div><div></div><div></div><div></div><div>gcobject 为具体的 gc 实现，实现了 `mark` 、`grab`、`release` 和 `collect` 方法。</div><div></div><div>`mark` 采用的直接向一 bool 变量设置标记。这个标记利用了 `trigger` 这个乒乓开关，每次 `collect` 都会切换状态。</div><div></div><div>`grab` 和 `release` 可以把对象挂接到 root 上，或从上取掉。</div><div></div><div>`collect` 会主动从 root 开始 `mark` ，并释放那些没有 `mark` 的对象。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcholder.cpp<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"i_gcholder.h"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;&lt;vector&gt;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">15</span>&nbsp;#include&nbsp;&lt;cassert&gt;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;gcholder&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcholder,&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;gcobject&nbsp;{<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;&nbsp;hold_set;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;&nbsp;unhold_set;<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;set_changed;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;hold_set_sorted;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;unhold_set_sorted;<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;combine_set();<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch();<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;hold(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set.push_back(obj);<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unhold(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set.push_back(obj);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_mark&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;mark();<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">45</span>&nbsp;<br /><span style="color: #008080; ">46</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;gcholder()&nbsp;:&nbsp;&nbsp;set_changed(<span style="color: #0000FF; ">false</span>),&nbsp;&nbsp;hold_set_sorted(<span style="color: #0000FF; ">true</span>)&nbsp;,&nbsp;&nbsp;unhold_set_sorted(<span style="color: #0000FF; ">true</span>)&nbsp;{&nbsp;&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;};<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcholder::combine_set(){<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!hold_set_sorted)&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::sort(hold_set.begin(),hold_set.end());<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!unhold_set_sorted)&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::sort(unhold_set.begin(),unhold_set.end());<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!unhold_set.empty())&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;::iterator&nbsp;iter1&nbsp;=&nbsp;hold_set.begin();<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;::iterator&nbsp;iter2&nbsp;=&nbsp;unhold_set.begin();<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(iter1&nbsp;!=&nbsp;hold_set.end()&nbsp;&amp;&amp;&nbsp;iter2&nbsp;!=&nbsp;unhold_set.end())&nbsp;{<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*iter1&nbsp;==&nbsp;*iter2)&nbsp;{<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*iter1&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter1;<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter2;<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(*iter1&nbsp;&lt;&nbsp;*iter2);<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter1;<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_gcobject&nbsp;*&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set.erase(std::remove(hold_set.begin(),hold_set.end(),<span style="color: #0000FF; ">null</span>)&nbsp;,&nbsp;hold_set.end());<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set.clear();<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">78</span>&nbsp;}<br /><span style="color: #008080; ">79</span>&nbsp;<br /><span style="color: #008080; ">80</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcholder::touch(){<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(set_changed)&nbsp;{<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combine_set();<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;std::for_each(hold_set.begin(),&nbsp;hold_set.end(),&nbsp;f_mark());<br /><span style="color: #008080; ">86</span>&nbsp;}<br /><span style="color: #008080; ">87</span>&nbsp;<br /><span style="color: #008080; ">88</span>&nbsp;i_gcholder&nbsp;*&nbsp;i_gcholder::create(){<br /><span style="color: #008080; ">89</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;gcholder;<br /><span style="color: #008080; ">90</span>&nbsp;}</div></div><div></div><div></div><br /><br /><div></div><div></div><div></div><div>gcholder 理论上可以有多个实例，并相互挂接。（否则不需要继承至 i_gcobject ）这个设计可以用来模拟多级的堆栈。但实际上并不需要这么复杂。因为在大部分应用里，如果你的程序有一个周期性的主循环，就可以不在 gc 系统里模拟出一个多级的堆栈。我们只用在循环之外做 collect 即可。再堆栈调用的较深层次触发 collect 反而效果不佳，会导致许多临时 gc 对象无法回收。</div><div></div><div>最后来看一个玩具代码，用 stl 里的 mutliset 实现了一个简单的树接口。可能没有什么使用价值，但它演示了一个较复杂的对象相互引用的关系。并可以展示 gc 如何正确工作。</div><div></div><div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;test.cpp<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;&lt;cstdio&gt;<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">set</span>&gt;<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_tree&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;link(i_tree&nbsp;*p)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_tree&nbsp;*&nbsp;create();<br /><span style="color: #008080; ">18</span>&nbsp;};<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;tree&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_tree&nbsp;,&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;gcobject&nbsp;{<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;tree&nbsp;*parent;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;std::multiset&lt;tree&nbsp;*&gt;&nbsp;children;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_mark&nbsp;{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(tree&nbsp;*node)&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node-&gt;mark();<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">28</span>&nbsp;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(parent)<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent-&gt;mark();<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::for_each(children.begin(),&nbsp;children.end(),&nbsp;f_mark());<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unlink();<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;link(i_tree&nbsp;*parent);<br /><span style="color: #008080; ">37</span>&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;tree()&nbsp;:&nbsp;parent(NULL)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create&nbsp;node&nbsp;%p\n",<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;~tree()&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("release&nbsp;node&nbsp;%p\n",<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;<br /><span style="color: #008080; ">47</span>&nbsp;};<br /><span style="color: #008080; ">48</span>&nbsp;<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;tree::unlink()&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(parent)&nbsp;{<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent-&gt;children.erase(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;tree::link(i_tree&nbsp;*p){<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;unlink();<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p)&nbsp;{<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree&nbsp;*&nbsp;cp&nbsp;=&nbsp;dynamic_cast&lt;tree&nbsp;*&gt;(p);<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp-&gt;children.insert(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;=&nbsp;cp;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">64</span>&nbsp;}<br /><span style="color: #008080; ">65</span>&nbsp;<br /><span style="color: #008080; ">66</span>&nbsp;i_tree&nbsp;*i_tree::create(){<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;tree;<br /><span style="color: #008080; ">68</span>&nbsp;}<br /><span style="color: #008080; ">69</span>&nbsp;<br /><span style="color: #008080; ">70</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(){<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;i_tree&nbsp;*root&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;root-&gt;grab();<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;i_tree&nbsp;*node;<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;node-&gt;link(root);<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;node-&gt;link(root);<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;printf("collected\n");<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;node-&gt;link(NULL);<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;printf("finalize\n");<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;root-&gt;release();<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">86</span>&nbsp;}</div></div><div></div><div></div><div>我们在实现一个基于 gc 的对象时，可以先定义出需要的接口，让接口从 i_gcobject 继承。例如上例中的 i_tree 。</div><div></div><div>然后在实现这个接口时，可以虚继承 gcobject 。例如上例中的 tree 。</div><div></div><div>如果有需要，就重载 touch 方法，在 touch 方法中 mark 相关的 gcobject 。对于 tree 这个例子，就是调用父亲和孩子节点的 mark 。</div><div></div><div>对象依然可以写析构函数，相当于对象的 finalize 。在析构函数中，不要再释放和它相关的 gcobject ，那些留给 gc 系统去完成。（例如在 tree 里，就不要在 ~tree 中 delete children 容器中的变量，也不需要把自己从父亲节点上摘掉）</div><div></div><div>如果仅仅只是使用那些接口，则不需要再包含 gcobject.h ，因为 gcobject 的细节只供实现 i_gcobject 时使用。</div><img src ="http://www.cppblog.com/Khan/aggbug/216620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2019-08-01 10:57 <a href="http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost的lexical_cast --数据类型转</title><link>http://www.cppblog.com/Khan/archive/2017/10/14/215297.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sat, 14 Oct 2017 08:26:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2017/10/14/215297.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/215297.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2017/10/14/215297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/215297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/215297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 注:转载请保证文章完整性一、介绍lexical_cast是boost中一个非常有用，常用，好用的库，我现在的小数据转换用的都是lexical_cast。&nbsp;lexical_cast最大的特点是安全，包括长度安全，类型安全。 下面我来介绍下lexical_cast的基本使用方法。Target lexical_cast(Source arg)例如:#include &lt;boost/le...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2017/10/14/215297.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/215297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2017-10-14 16:26 <a href="http://www.cppblog.com/Khan/archive/2017/10/14/215297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost中asio网络库多线程并发处理实现，以及asio在多线程模型中线程的调度情况和线程安全。 (转载)</title><link>http://www.cppblog.com/Khan/archive/2017/10/14/215295.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sat, 14 Oct 2017 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2017/10/14/215295.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/215295.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2017/10/14/215295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/215295.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/215295.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自(http://www.cnblogs.com/lidabo/p/3906055.html)1、实现多线程方法： &nbsp;&nbsp;&nbsp; 其实就是多个线程同时调用io_service::run 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2017/10/14/215295.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/215295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2017-10-14 11:44 <a href="http://www.cppblog.com/Khan/archive/2017/10/14/215295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解析 ipa 文件版本号等信息(基于 python)</title><link>http://www.cppblog.com/Khan/archive/2015/01/04/209386.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sun, 04 Jan 2015 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2015/01/04/209386.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/209386.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2015/01/04/209386.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/209386.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/209386.html</trackback:ping><description><![CDATA[python 3.x<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">!/usr/bin/python</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Filename:&nbsp;ipaInfo3.py</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;author&nbsp;khan.lau</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;python&nbsp;3.x</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;zipfile,&nbsp;plistlib,&nbsp;sys,&nbsp;re<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;analyze_ipa_with_plistlib(ipa_path):<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipa_file&nbsp;=&nbsp;zipfile.ZipFile(ipa_path)<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plist_path&nbsp;=&nbsp;find_plist_path(ipa_file)<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plist_data&nbsp;=&nbsp;ipa_file.read(plist_path)<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plist_root&nbsp;=&nbsp;plistlib.loads(plist_data)<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_ipa_info(plist_root)<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;print_ipa_info(plist_root):<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;(<span style="color: #800000; ">'</span><span style="color: #800000; ">Display&nbsp;Name:&nbsp;%s</span><span style="color: #800000; ">'</span>&nbsp;%&nbsp;plist_root[<span style="color: #800000; ">'</span><span style="color: #800000; ">CFBundleName</span><span style="color: #800000; ">'</span>])<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;(<span style="color: #800000; ">'</span><span style="color: #800000; ">Bundle&nbsp;Identifier:&nbsp;%s</span><span style="color: #800000; ">'</span>&nbsp;%&nbsp;plist_root[<span style="color: #800000; ">'</span><span style="color: #800000; ">CFBundleIdentifier</span><span style="color: #800000; ">'</span>])<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;(<span style="color: #800000; ">'</span><span style="color: #800000; ">Version:&nbsp;%s</span><span style="color: #800000; ">'</span>&nbsp;%&nbsp;plist_root[<span style="color: #800000; ">'</span><span style="color: #800000; ">CFBundleShortVersionString</span><span style="color: #800000; ">'</span>])<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;find_plist_path(zip_file):<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name_list&nbsp;=&nbsp;zip_file.namelist()<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;print&nbsp;name_list</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;=&nbsp;re.compile(r<span style="color: #800000; ">'</span><span style="color: #800000; ">Payload/[^/]*.app/Info.plist</span><span style="color: #800000; ">'</span>)<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;path&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;name_list:<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;=&nbsp;pattern.match(path)<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;m&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #0000FF; ">not</span>&nbsp;None:<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m.group()<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;<br /><span style="color: #008080; ">33</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #800080; ">__name__</span>&nbsp;==&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">'</span>:<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args&nbsp;=&nbsp;sys.argv[1:]<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;len(args)&nbsp;&lt;&nbsp;1:<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;(<span style="color: #800000; ">'</span><span style="color: #800000;">Usage:&nbsp;python ipaInfo3.py&nbsp;/path/to/ipa</span><span style="color: #800000; ">'</span>)<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipa_path&nbsp;=&nbsp;args[0]<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;analyze_ipa_with_plistlib(ipa_path)<br /><span style="color: #008080; ">41</span>&nbsp;</div><br /><br />python 2.7.x<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">!/usr/bin/python</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Filename:&nbsp;ipaInfo2.py</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;author&nbsp;khan.lau</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;python&nbsp;2.7.5</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;project&nbsp;need&nbsp;third_party&nbsp;lib&nbsp;biplist,&nbsp;please&nbsp;run&nbsp;'sudo&nbsp;pip&nbsp;install&nbsp;biplist'</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;zipfile,&nbsp;biplist,&nbsp;sys,&nbsp;re<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;analyze_ipa_with_plistlib(ipa_path):<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipa_file&nbsp;=&nbsp;zipfile.ZipFile(ipa_path)<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plist_path&nbsp;=&nbsp;find_plist_path(ipa_file)<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plist_data&nbsp;=&nbsp;ipa_file.read(plist_path)<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plist_root&nbsp;=&nbsp;biplist.readPlistFromString(plist_data)<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_ipa_info(plist_root)<br /><span style="color: #008080; ">17</span>&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;print_ipa_info(plist_root):<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;(<span style="color: #800000; ">'</span><span style="color: #800000; ">Display&nbsp;Name:&nbsp;%s</span><span style="color: #800000; ">'</span>&nbsp;%&nbsp;plist_root[<span style="color: #800000; ">'</span><span style="color: #800000; ">CFBundleName</span><span style="color: #800000; ">'</span>])<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;(<span style="color: #800000; ">'</span><span style="color: #800000; ">Bundle&nbsp;Identifier:&nbsp;%s</span><span style="color: #800000; ">'</span>&nbsp;%&nbsp;plist_root[<span style="color: #800000; ">'</span><span style="color: #800000; ">CFBundleIdentifier</span><span style="color: #800000; ">'</span>])<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;(<span style="color: #800000; ">'</span><span style="color: #800000; ">Version:&nbsp;%s</span><span style="color: #800000; ">'</span>&nbsp;%&nbsp;plist_root[<span style="color: #800000; ">'</span><span style="color: #800000; ">CFBundleShortVersionString</span><span style="color: #800000; ">'</span>])<br /><span style="color: #008080; ">22</span>&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;find_plist_path(zip_file):<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name_list&nbsp;=&nbsp;zip_file.namelist()<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;print&nbsp;name_list</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;=&nbsp;re.compile(r<span style="color: #800000; ">'</span><span style="color: #800000; ">Payload/[^/]*.app/Info.plist</span><span style="color: #800000; ">'</span>)<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;path&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;name_list:<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;=&nbsp;pattern.match(path)<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;m&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #0000FF; ">not</span>&nbsp;None:<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m.group()<br /><span style="color: #008080; ">31</span>&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #800080; ">__name__</span>&nbsp;==&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">'</span>:<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args&nbsp;=&nbsp;sys.argv[1:]<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;len(args)&nbsp;&lt;&nbsp;1:<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;(<span style="color: #800000; ">'</span><span style="color: #800000; ">Usage:&nbsp;python ipaInfo2</span><span style="color: #800000; ">.py&nbsp;/path/to/ipa</span><span style="color: #800000; ">'</span>)<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipa_path&nbsp;=&nbsp;args[0]<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;analyze_ipa_with_plistlib(ipa_path)</div><br /><br />python2.7 不包含 plistlib, 所以需要引入第三方库 biplist, &nbsp;使用 easy_install 或 pip 安装库即可, biplist 支持 data 解析, 相对于 plistlib 而已, 只需改动极少代码, 所以采用他<br /><img src ="http://www.cppblog.com/Khan/aggbug/209386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2015-01-04 13:10 <a href="http://www.cppblog.com/Khan/archive/2015/01/04/209386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>视频流相关名词介绍</title><link>http://www.cppblog.com/Khan/archive/2013/03/24/198787.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sun, 24 Mar 2013 13:56:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/03/24/198787.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198787.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/03/24/198787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198787.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198787.html</trackback:ping><description><![CDATA[<div>I frame ：帧内编码帧 又称intra picture，I 帧通常是每个 GOP（MPEG 所使用的一种视频压缩技术）的第一个帧，经过适度地压缩，做为随机访问的参考点，可以当成图象。I帧可以看成是一个图像经过压缩后的产物。</div><div></div><div>P frame: 前向预测编码帧 又称predictive-frame，通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像，也叫预测帧；</div><div></div><div>B frame: 双向预测内插编码帧 又称bi-directional interpolated prediction frame，既考虑与源图像序列前面已编码帧，也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像，也叫双向预测帧；<br /></div><div></div><div>DTS Decode Time Stamp（解码时间戳）DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。</div><div></div><div>PTS Presentation Time Stamp（显示时间戳）PTS主要用于度量解码后的视频帧什么时候被显示出来<br /><br /></div><div></div><div>&nbsp; &nbsp; DTS和PTS分别是解码器进行解码和显示帧时相对于SCR（系统参考）的时间戳。SCR可以理解为解码器应该开始从磁盘读取数据时的时间。</div><div></div><div>&nbsp; &nbsp; mpeg文件中的每一个包都有一个SCR时间戳并且这个时间戳就是读取这个数据包时的系统时间。通常情况下，解码器会在它开始读取mpeg流时启动系统时钟（系统时钟的初始值是第一个数据包的SCR值，通常为0但也可以不从0开始）。</div><div></div><div>&nbsp; &nbsp; DTS 时间戳决定了解码器在SCR时间等于DTS时间时进行解码，PTS时间戳也是类似的。通常，DTS/PTS时间戳指示的是晚于音视频包中的SCR的一个时 间。例如，如果一个视频数据包的SCR是100ms（意味着此包是播放100ms以后从磁盘中读取的），那么DTS/PTS值就差不多是200 /280ms，表明当SCR到200ms时这个视频数据应该被解码并在80ms以后被显示出来（视频数据在一个buffer中一直保存到开始解码）</div><div>&nbsp; &nbsp; 下溢通常发生在设置的视频数据流相关mux率太高。如果mux率是1000000bits/sec（意味着解码器要以1000000bits/sec的速率 读取文件），可是视频速率是2000000bits/sec（意味着需要以2000000bits/sec的速率显示视频数据），从磁盘中读取视频数据时 速度不够快以至于1秒钟内不能够读取足够的视频数据。这种情况下DTS/PTS时间戳就会指示视频在从硬盘中读出来之前进行解码或显示（DTS/PTS时间戳就要比包含它们的数据包中的SCR时间要早了）。</div><div>&nbsp; &nbsp; 如今依靠解码器，着基本已经不是什么问题了（尽管MPEG文件因为应该没有下溢而并不完全符合MPEG标准）。一些解码器（很多著名的基于PC的播放器）尽可能快的读取文件以便显示视频，可以的话直接忽略SCR。</div><div>&nbsp; &nbsp; 注意在你提供的列表中，平均的视频流速率为～3Mbps（3000000bits/sec）但是它的峰值达到了14Mbps（相当大，DVD限制在 9.8Mbps内）。这意味着mux率需要调整足够大以处理14Mbps的部分， bbMPEG计算出来的mux率有时候太低而导致下溢。</div><div>&nbsp; &nbsp; 你计划让视频流速率这么高么？这已经超过了DVD的说明了，而且很可能在大多数独立播放其中都不能播放。如果你不是这么计划，我会从1增加mquant的值并且在视频设置中将最大码流设置为9Mbps以保持一个小一点的码流。</div><div>&nbsp; &nbsp; 如果你确实想让视频码率那么高，你需要增大mux率。从提供的列表可以得出bbMPEG使用14706800bits/sec或者1838350bytes /sec的mux率（总数据速率为：1838350bytes/sec（14706800bits/sec）行）。你在强制mux率字段设置的值应该是以 bytes/sec为单位并被50整除。所以我会从36767（1838350/50）开始，一直增加直到不会再出现下溢错误为止.<br /></div><div></div><div></div><div>在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。<br /></div><div></div><div>I P B帧的不同：</div><div></div><div>I frame:自身可以通过视频解压算法解压成一张单独的完整的图片。</div><div></div><div>P frame：需要参考其前面的一个I frame 或者B frame来生成一张完整的图片。</div><div></div><div>B frame:则要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。</div><div></div><div>两个I frame之间形成一个GOP，在x264中同时可以通过参数来设定bf的大小，即：I 和p或者两个P之间B的数量。</div><div></div><div>通过上述基本可以说明如果有B frame 存在的情况下一个GOP的最后一个frame一定是P.<br /></div><div></div><div>DTS和PTS的不同：</div><div></div><div>DTS主要用于视频的解码,在解码阶段使用.PTS主要用于视频的同步和输出.在display的时候使用.在没有B frame的情况下.DTS和PTS的输出顺序是一样的.<br /></div><div></div><div></div><div>例子:</div><div></div><div>下面给出一个GOP为15的例子,其解码的参照frame及其解码的顺序都在里面:<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/khan/6584/o_201107272227028458.jpg" alt="" border="0" height="224" width="640" /></div><div></div><div></div><div></div><div>如上图：I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.<br /><br /><br /><br /><div>sample_rate<strong>&nbsp; 采样率</strong></div></div><div></div><img src ="http://www.cppblog.com/Khan/aggbug/198787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-03-24 21:56 <a href="http://www.cppblog.com/Khan/archive/2013/03/24/198787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下播放器设计和开发</title><link>http://www.cppblog.com/Khan/archive/2013/03/24/198767.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sun, 24 Mar 2013 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/03/24/198767.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198767.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/03/24/198767.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198767.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198767.html</trackback:ping><description><![CDATA[<div>播放器设计与开发 &nbsp;</div><div></div><div>转载自http://hi.baidu.com/zhaozequan</div><div>kf701.ye@gmail.com 2008</div><div></div><div></div><div>本文根据DawnLightPlayer的开发经验写成。DawnLithtPlayer是今天3月份开始,和maddrone一起在业余时间开发的一个跨平台，多线程的播放器,主要是在Linux下面开发的,文中所用示例代码均截自其中。</div><div>DawnLightPlayer目前可以运行在Linux和Windows系统上，并使用VC和Python开发了GUI，支持大部分的音视频文件格式和网络流，另外新增对CMMB协议的支持,不支持 RMVB, SWF 等尚未公开协议的视频文件格式。</div><div></div><div>目录:</div><div>一. 播放器的流程</div><div>&nbsp; &nbsp;1. 输入</div><div>&nbsp; &nbsp;2. 解码</div><div>&nbsp; &nbsp;3. 输出</div><div>二. 播放器的实现</div><div>&nbsp; &nbsp;1. 输入实现</div><div>&nbsp; &nbsp;2. 解码线程实现</div><div>&nbsp; &nbsp;3. 输出线程实现</div><div>三. 视频输出库</div><div>&nbsp; &nbsp;1. SDL (多平台,支持硬件缩放)</div><div>&nbsp; &nbsp;2. DirectX DirectDraw (win32平台,支持硬件缩放)</div><div>&nbsp; &nbsp;3. OpenGL (多平台,支持硬件缩放)</div><div>&nbsp; &nbsp;4. X11 (Linux/Unix)</div><div>&nbsp; &nbsp;5. FrameBuffer (Linux, 无硬件缩放)</div><div>四. 音频输出</div><div>&nbsp; &nbsp;1. OSS (Open Sound System for Linux)</div><div>&nbsp; &nbsp;2. ALSA (Advanced Linux Sound Architecture)</div><div>&nbsp; &nbsp;3. DirectSound (WIN32)</div><div>五. 音视频同步</div><div>&nbsp; &nbsp;1. 以音频为基准同步视频</div><div>&nbsp; &nbsp;2. 以视频为基准同步音频</div><div>&nbsp; &nbsp;3. 同步于一个外部时钟</div><div>六. 截图</div><div>&nbsp; &nbsp;1. 使用jpeglib保存成jpeg文件</div><div>&nbsp; &nbsp;2. 使用libpng保存成png文件</div><div>七. YUV RGB 软件转换</div><div>八. 软件缩放</div><div></div><div></div><div></div><div>一. 播放器的流程</div><div></div><div>1. 输入 : 从文件或网络等读取原数据，如 x.avi, x.mov, rtsp://xxx, 对原数据进行解析，比如文件，首先要分析文件格式，从文件中取得音视频编码参数，视频时间长度等信息，然后要从其中取出音频编码数据和视频编码数据送到解 码部分，这里暂称这种编码源数据块为 packet。</div><div></div><div>2. 解码 : 初始化时，利用输入端从源数据中取得的信息调用不同的解码库初始化；然后接收输入端传送来的音视频编码数据，分别进行音频解码和视频解码，视频解码出来的 数据一般是 YUV 或 RGB 数据，这里暂称为 picture, 音频解码出来的数据是采样数据，是声卡可以播放的数据，这里暂称为 sample。 解码所得的数据接下来送到输出部分。</div><div></div><div>3. 输出 ： 接收解码部分送来的 picture 和 sample 并显示。 视频显示一般使用某个图形库，如 SDL, Xlib, DirectDraw, OpengGL, FrameBuffer等, 音频输出是把 sample 写入系统的音频驱动，由音频驱动送入声卡播放, 可用的音频输出有 ALSA, OSS, SDL, DirectSound, WaveOut等。</div><div></div><div>二. 播放器的实现</div><div></div><div>推荐实现方案</div><div>一个audio_packet队列，一个video_packet队列,一个picture队列，一个sample队列</div><div>一个input线程，两个decode线程，两个output线程,一个UI控制线程</div><div></div><div>1. 输入实现</div><div>对 文件的解析，首先要了解文件的格式，文件格式一般称为文件容器。公开的文件格式，按格式协议读取分析就可以了，但像RMVB,SWF这种目前还不公开格式 的文件，就不好办，也是目前一般播放器的困难。一般的文件格式的解析libavformat库已经做了，只要使用它就行，下面给出示例代码段:</div><div></div><div>初始化：</div><div>static int avin_file_init(void)</div><div>{</div><div>&nbsp; &nbsp; AVFormatParameters params, *ap = &amp;params;</div><div>&nbsp; &nbsp; err = av_open_input_file( &amp;fmtctx, input_filename, NULL, 0, ap );</div><div>&nbsp; &nbsp; if ( err &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "%d: init input from file error\n", __LINE__);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; print_error( input_filename, err );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; fmtctx-&gt;flags |= AVFMT_FLAG_GENPTS;</div><div></div><div>&nbsp; &nbsp; err = av_find_stream_info( fmtctx );</div><div>&nbsp; &nbsp; if ( err &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "%d: init input from file error\n", __LINE__);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; print_error( input_filename, err );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; if (fmtctx-&gt;pb) fmtctx-&gt;pb-&gt;eof_reached = 0;</div><div>&nbsp; &nbsp; dump_format( fmtctx, 0, input_filename, 0 );</div><div></div><div>&nbsp; &nbsp; ....</div><div>}</div><div>读取packet:</div><div>while( 1 )</div><div>{</div><div>&nbsp; &nbsp; AVPacket *pkt = NULL;</div><div>&nbsp; &nbsp; pkt = av_malloc( sizeof(AVPacket) );</div><div>&nbsp; &nbsp; ret = av_read_frame(fmtctx, pkt);</div><div>&nbsp; &nbsp;&nbsp;</div><div>送出packet到解码部分:</div><div>&nbsp; &nbsp; 可以memcpy, 或用LinkList结构处理,如:</div><div>&nbsp; &nbsp; push_to_video_packet_queue(pkt);</div><div>}</div><div></div><div>如果是自己的私有输入，比如移动电视的视频输入,代码如下,部分是伪代码:</div><div>while( 1 )</div><div>{</div><div>&nbsp; &nbsp; your_parse_code();</div><div>&nbsp; &nbsp; size = your_get_video_data(buf);</div><div></div><div>&nbsp; &nbsp; pkt = av_mallocz( sizeof(AVPacket) );</div><div>&nbsp; &nbsp; x = av_new_packet( pkt, vret);</div><div>&nbsp; &nbsp; memcpy( pkt-&gt;data, buf, size );</div><div>&nbsp; &nbsp; pkt-&gt;pts = your_time;</div><div></div><div>&nbsp; &nbsp; push_to_video_packet_queue(pkt);</div><div>}</div><div></div><div>2. 解码线程实现</div><div>解码是个算法大课题，大多只能使用已有的解码库，如libavcodec,下面示例代码:</div><div>while ( 1 )</div><div>{</div><div>&nbsp; &nbsp; AVPicture *picture;</div><div>&nbsp; &nbsp; AVPacket *pkt = pop_from_video_packet_queue();</div><div>&nbsp; &nbsp; AVFrame *frame = avcodec_alloc_frame();</div><div>&nbsp; &nbsp; avcodec_decode_video(video_ctxp, frame, &amp;got_picture, pkt-&gt;data, pkt-&gt;size);</div><div>&nbsp; &nbsp; if ( got_picture )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; convert_frame_to_picture( picture, frame );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; picture-&gt;pts = pkt-&gt;pts;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; push_to_picture_queue( picture );</div><div>&nbsp; &nbsp; }</div><div>}</div><div>音频雷同</div><div></div><div>3. 输出线程实现</div><div></div><div>视 频输出要控制FPS，比如25帧每秒的视频，那么每一帧的显示时间要是1/25秒，但把一帧RGB数据写入显存用不了1/25秒的时间，那么就要控制，不 能让25帧的数据在0.1或0.2秒的时间内就显示完了，最简单的实现是在每显示一帧数据后，sleep( 1/fps - 显示用去的时间 )。</div><div></div><div>音 视频同步这个重要的工作也要在输出线程里完成。以音频为基准同步视频，以视频为基准同步音频，或与一个外部时钟同步，都是可行的方法，但以音频为基准同步 视频是最简单也最有效的方法。音频驱动只要设置好sample rate, sample size 和 channels 后， write 数据就会以此恒定的速度播放， 如果驱动的输出 buffer 满，则 write 就可以等待。</div><div></div><div>视频:</div><div>while( 1 )</div><div>{</div><div>&nbsp; &nbsp; picture = pop_from_picture_queue();</div><div>&nbsp; &nbsp; picture_shot( picture ); /* 截图 */</div><div>&nbsp; &nbsp; vo-&gt;display( picture );</div><div>&nbsp; &nbsp; video_pts = picture-&gt;pts;</div><div>&nbsp; &nbsp; sync_with_audio(); /* 同步 */</div><div>&nbsp; &nbsp; control_fps(); /* FPS */</div><div>}</div><div>音频：</div><div>while( 1 )</div><div>{</div><div>&nbsp; &nbsp; sample = pop_from_sample_queue();</div><div>&nbsp; &nbsp; ao-&gt;play( sample );</div><div>&nbsp; &nbsp; now_pts = sample-&gt;pts;</div><div>}</div><div></div><div>三. 视频输出库</div><div></div><div>1. SDL (多平台,支持硬件缩放)</div><div></div><div>SDL(Simple DirectMedia Layer) is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.</div><div></div><div>其实SDL就是一个中间件，它封装了下层的OpenGL, FrameBuffer, X11, DirectX等给上层提供一个统一的API接口，使用SDL的优点是我们不必再为X11或DirectX分别做个视频输出程序了。</div><div></div><div>SDL可以直接显示YUV数据和RGB数据,一般解码得到的picture都是YUV420P格式的,不用做YUV2RGB的转换就可以直接显示,主要代码如下:</div><div></div><div>static int vo_sdl_init(void)</div><div>{</div><div>&nbsp; &nbsp; ....</div><div>&nbsp; &nbsp; screen = SDL_SetVideoMode(ww, wh, 0, flags);</div><div>&nbsp; &nbsp; overlay = SDL_CreateYUVOverlay(dw, dh, SDL_YV12_OVERLAY, screen);</div><div>&nbsp; &nbsp;....</div><div>}</div><div></div><div>static void vo_sdl_display(AVPicture *pict)</div><div>{</div><div>&nbsp; &nbsp; SDL_Rect rect;</div><div>&nbsp; &nbsp; AVPicture p;</div><div></div><div>&nbsp; &nbsp; SDL_LockYUVOverlay(overlay);</div><div>&nbsp; &nbsp; p.data[0] = overlay-&gt;pixels[0];</div><div>&nbsp; &nbsp; p.data[1] = overlay-&gt;pixels[2];</div><div>&nbsp; &nbsp; p.data[2] = overlay-&gt;pixels[1];</div><div>&nbsp; &nbsp; p.linesize[0] = overlay-&gt;pitches[0];</div><div>&nbsp; &nbsp; p.linesize[1] = overlay-&gt;pitches[2];</div><div>&nbsp; &nbsp; p.linesize[2] = overlay-&gt;pitches[1];</div><div>&nbsp; &nbsp; vo_sdl_sws( &amp;p, pict ); /* only do memcpy */</div><div>&nbsp; &nbsp; SDL_UnlockYUVOverlay(overlay);</div><div></div><div>&nbsp; &nbsp; rect.x = dx;</div><div>&nbsp; &nbsp; rect.y = dy;</div><div>&nbsp; &nbsp; rect.w = dw;</div><div>&nbsp; &nbsp; rect.h = dh;</div><div>&nbsp; &nbsp; SDL_DisplayYUVOverlay(overlay, &amp;rect);</div><div>}</div><div></div><div>2. DirectX DirectDraw (win32平台,支持硬件缩放)</div><div></div><div>DirectX是window上使用较多的一种输出,也支持直接YUV或RGB显示，示例代码:</div><div></div><div>static int vo_dx_init(void)</div><div>{</div><div>&nbsp; &nbsp; DxCreateWindow();</div><div>&nbsp; &nbsp; DxInitDirectDraw();</div><div>&nbsp; &nbsp; DxCreatePrimarySurface();</div><div>&nbsp; &nbsp; DxCreateOverlay();</div><div>&nbsp; &nbsp; DetectImgFormat();</div><div>}</div><div></div><div>static void vo_dx_display(AVPicture *pic)</div><div>{</div><div>&nbsp; &nbsp; vfmt2rgb(my_pic, pic);</div><div>&nbsp; &nbsp; memcpy( g_image, my_pic-&gt;data[0], my_pic-&gt;linesize[0] * height );</div><div>&nbsp; &nbsp; flip_page();</div><div>}</div><div></div><div>3. OpenGL (多平台,支持硬件缩放)</div><div></div><div>OpenGL是3D游戏库，跨平台，效率高，支持大多数的显示加速，显示2D RGB数据只要使用glDrawPixels函数就足够了,同时禁用一些OpenGL管线操作效率更高,如:</div><div></div><div>&nbsp; &nbsp; glDisable( GL_SCISSOR_TEST );</div><div>&nbsp; &nbsp; glDisable( GL_ALPHA_TEST );</div><div>&nbsp; &nbsp; glDisable( GL_DEPTH_TEST );</div><div>&nbsp; &nbsp; glDisable( GL_DITHER );</div><div></div><div>4. X11 (Linux/Unix)</div><div></div><div>X11 是Unix/Linux系统平台上的基本图形界面库，像普通的GTK，QT等主要都是建立在X11的基础之上。但X11的API接口太多，复杂，很不利于 开发，基本的GUI程序一般都会使用GTK，QT等，不会直接调用X11的API，这里只是为了效率。MPlyaer的libvo里有X11的完整使用代 码，包括全屏等功能。</div><div></div><div>static void vo_x11_display(AVPicture* pic)</div><div>{</div><div>&nbsp; &nbsp; vfmt2rgb( my_pic, pic );</div><div>&nbsp; &nbsp; Ximg-&gt;data = my_pic-&gt;data[0];</div><div>&nbsp; &nbsp; XPutImage(Xdisplay, Xvowin, Xvogc, Ximg,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, 0, 0, 0, dw, dh);</div><div>&nbsp; &nbsp; XSync(Xdisplay, False);</div><div>&nbsp; &nbsp; XSync(Xdisplay, False);</div><div>}</div><div></div><div>5. FrameBuffer (Linux, 无硬件缩放)</div><div></div><div>FrameBuffer是Linux内核的一部分，提供一个到显存的存取地址的map,但没有任何加速使用。</div><div></div><div>static void vo_fb_display(AVPicture *pic)</div><div>{</div><div>&nbsp; &nbsp; int i;</div><div>&nbsp; &nbsp; uint8_t *src, *dst = fbctxp-&gt;mem;</div><div></div><div>&nbsp; &nbsp; vfmt2rgb( my_pic, pic );</div><div>&nbsp; &nbsp; src = my_pic-&gt;data[0];</div><div></div><div>&nbsp; &nbsp; for ( i = 0; i &lt; fbctxp-&gt;dh; i++ )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; memcpy( dst, src, fbctxp-&gt;dw * (fbctxp-&gt;varinfo.bits_per_pixel / 8) );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; dst += fbctxp-&gt;fixinfo.line_length;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; src += my_pic-&gt;linesize[0];</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>四. 音频输出</div><div></div><div>1. OSS (Open Sound System for Linux)</div><div></div><div>OSS是Linux下面最简单的音频输出了，直接write就可以。</div><div></div><div>static int ao_oss_init(void)</div><div>{</div><div>&nbsp; &nbsp; int i;</div><div>&nbsp; &nbsp; dsp = open(dsp_dev, O_WRONLY);</div><div>&nbsp; &nbsp; if ( dsp &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "open oss: %s\n", strerror(errno));</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; i = sample_rate;</div><div>&nbsp; &nbsp; ioctl (dsp, SNDCTL_DSP_SPEED, &amp;i);</div><div>&nbsp; &nbsp; i = format2oss(sample_fmt);</div><div>&nbsp; &nbsp; ioctl(dsp, SNDCTL_DSP_SETFMT, &amp;i);</div><div>&nbsp; &nbsp; i = channels;</div><div>&nbsp; &nbsp; if ( i &gt; 2 ) i = 2;</div><div>&nbsp; &nbsp; ioctl(dsp, SNDCTL_DSP_CHANNELS, &amp;i);</div><div></div><div>&nbsp; &nbsp; return 0;</div><div>}</div><div></div><div>static void ao_oss_play(AVSample *s)</div><div>{</div><div>&nbsp; &nbsp; write(dsp, s-&gt;data, s-&gt;size);</div><div>}</div><div></div><div>2. ALSA (Advanced Linux Sound Architecture)</div><div></div><div>ALSA做的比较失败，长长的函数名。</div><div></div><div>static void ao_alsa_play(AVSample *s)</div><div>{</div><div>&nbsp; &nbsp; int num_frames = s-&gt;size / bytes_per_sample;</div><div>&nbsp; &nbsp; snd_pcm_sframes_t res = 0;</div><div>&nbsp; &nbsp; uint8_t *data = s-&gt;data;</div><div></div><div>&nbsp; &nbsp; if (!alsa_handle)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return ;</div><div></div><div>&nbsp; &nbsp; if (num_frames == 0)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return ;</div><div></div><div>rewrite:</div><div>&nbsp; &nbsp; res = snd_pcm_writei(alsa_handle, data, num_frames);</div><div>&nbsp; &nbsp; if ( res == -EINTR )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; goto rewrite;</div><div>&nbsp; &nbsp; if ( res &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; snd_pcm_prepare(alsa_handle);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; goto rewrite;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; if ( res &lt; num_frames )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; data += res * bytes_per_sample;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; num_frames -= res;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; goto rewrite;</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>3. DirectSound (WIN32)</div><div></div><div>MS DirectX的一部分,它的缺点是不如Linux里面的OSS或ALSA那样，在没有sample写入的时候，自动 silent,DirectSound在播放过程中，当没有sample数据送入输出线程时，它总是回放最后0.2或0.5秒的数据。由于只是最近移植 DawnLightPlayer才使用起Windows，不太了解其机制。</div><div></div><div>static void dsound_play(AVSample *s)</div><div>{</div><div>&nbsp; &nbsp; int wlen, ret, len = s-&gt;size;</div><div>&nbsp; &nbsp; uint8_t *data = s-&gt;data;</div><div></div><div>&nbsp; &nbsp; while ( len &gt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; wlen = dsound_getspace();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if ( wlen &gt; len ) wlen = len;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ret = write_buffer(data, wlen);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; data += ret;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; len -= ret;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; usleep(10*1000);</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>五. 音视频同步</div><div></div><div>1. 以音频为基准同步视频</div><div></div><div>视频输出线程中如下处理:</div><div>&nbsp; &nbsp; start_time = now();</div><div>&nbsp; &nbsp; ....</div><div>&nbsp; &nbsp; vo-&gt;display( picture );</div><div>&nbsp; &nbsp; last_video_pts = picture-&gt;pts;</div><div>&nbsp; &nbsp; end_time = now();</div><div>&nbsp; &nbsp; rest_time = end_time - start_time;</div><div>&nbsp; &nbsp; av_diff = last_audio_pts - last_video_pts;</div><div>&nbsp; &nbsp; if ( av_diff &gt; 0.2 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if ( av_diff &lt; 0.5 ) rest_time -= rest_time / 4;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; else rest_time -= rest_time / 2;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; else if ( av_diff &lt; -0.2)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if ( av_diff &gt; -0.5 ) rest_time += rest_time / 4;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; else rest_time += rest_time / 2;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; if ( rest_time &gt; 0 )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; usleep(rest_time);</div><div></div><div>2. 以视频为基准同步音频</div><div></div><div></div><div>3. 同步于一个外部时钟</div><div></div><div></div><div></div><div>六. 截图</div><div></div><div>截图可以在解码线程做，也可以在输出线程做，见前面的输出线程部分。只要在display前把picture保存起来即可。一般加一些编码，如保存成 PNG 或 JPEG 格式。</div><div></div><div>1. 使用jpeglib保存成jpeg文件</div><div></div><div>static void draw_jpeg(AVPicture *pic)</div><div>{</div><div>&nbsp; &nbsp; char fname[128];</div><div>&nbsp; &nbsp; struct jpeg_compress_struct cinfo;</div><div>&nbsp; &nbsp; struct jpeg_error_mgr jerr;</div><div>&nbsp; &nbsp; JSAMPROW row_pointer[1];</div><div>&nbsp; &nbsp; int row_stride;</div><div>&nbsp; &nbsp; uint8_t *buffer;</div><div></div><div>&nbsp; &nbsp; if ( !po_status )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return ;</div><div></div><div>&nbsp; &nbsp; vfmt2rgb24(my_pic, pic);</div><div>&nbsp; &nbsp; buffer = my_pic-&gt;data[0];</div><div></div><div>#ifdef __MINGW32__</div><div>&nbsp; &nbsp; sprintf(fname, "%s\\DLPShot-%d.jpg", get_save_path(), framenum++);</div><div>#else</div><div>&nbsp; &nbsp; sprintf(fname, "%s/DLPShot-%d.jpg", get_save_path(), framenum++);</div><div>#endif</div><div>&nbsp; &nbsp; fp = fopen (fname, "wb");</div><div>&nbsp; &nbsp; if (fp == NULL)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "fopen %s error\n", fname);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; cinfo.err = jpeg_std_error(&amp;jerr);</div><div>&nbsp; &nbsp; jpeg_create_compress(&amp;cinfo);</div><div>&nbsp; &nbsp; jpeg_stdio_dest(&amp;cinfo, fp);</div><div></div><div>&nbsp; &nbsp; cinfo.image_width = width;</div><div>&nbsp; &nbsp; cinfo.image_height = height;</div><div>&nbsp; &nbsp; cinfo.input_components = 3;</div><div>&nbsp; &nbsp; cinfo.in_color_space = JCS_RGB;</div><div></div><div>&nbsp; &nbsp; jpeg_set_defaults(&amp;cinfo);</div><div>&nbsp; &nbsp; cinfo.write_JFIF_header = TRUE;</div><div>&nbsp; &nbsp; cinfo.JFIF_major_version = 1;</div><div>&nbsp; &nbsp; cinfo.JFIF_minor_version = 2;</div><div>&nbsp; &nbsp; cinfo.density_unit = 1;</div><div>&nbsp; &nbsp; cinfo.X_density = jpeg_dpi * width / width;</div><div>&nbsp; &nbsp; cinfo.Y_density = jpeg_dpi * height / height;</div><div>&nbsp; &nbsp; cinfo.write_Adobe_marker = TRUE;</div><div></div><div>&nbsp; &nbsp; jpeg_set_quality(&amp;cinfo, jpeg_quality, jpeg_baseline);</div><div>&nbsp; &nbsp; cinfo.optimize_coding = jpeg_optimize;</div><div>&nbsp; &nbsp; cinfo.smoothing_factor = jpeg_smooth;</div><div>&nbsp; &nbsp; if ( jpeg_progressive_mode )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; jpeg_simple_progression(&amp;cinfo);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; jpeg_start_compress(&amp;cinfo, TRUE);</div><div></div><div>&nbsp; &nbsp; row_stride = width * 3;</div><div>&nbsp; &nbsp; while (cinfo.next_scanline &lt; height)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; row_pointer[0] = &amp;buffer[cinfo.next_scanline * row_stride];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; (void)jpeg_write_scanlines(&amp;cinfo, row_pointer, 1);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; jpeg_finish_compress(&amp;cinfo);</div><div>&nbsp; &nbsp; fclose(fp);</div><div>&nbsp; &nbsp; jpeg_destroy_compress(&amp;cinfo);</div><div></div><div>&nbsp; &nbsp; return ;</div><div>}</div><div></div><div>2. 使用libpng保存成png文件</div><div></div><div>static void draw_png(AVPicture *pic)</div><div>{</div><div>&nbsp; &nbsp; int k;</div><div>&nbsp; &nbsp; png_byte *row_pointers[height]; /* GCC C99 */</div><div></div><div>&nbsp; &nbsp; if ( init_png() &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "draw_png: init png error\n");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return ;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; vfmt2rgb24( my_pic, pic );</div><div></div><div>&nbsp; &nbsp; for ( k = 0; k &lt; height; k++ )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; row_pointers[k] = my_pic-&gt;data[0] + my_pic-&gt;linesize[0] * k;</div><div></div><div>&nbsp; &nbsp; png_write_image(png.png_ptr, row_pointers);</div><div></div><div>&nbsp; &nbsp; destroy_png();</div><div>}</div><div></div><div></div><div>七. YUV RGB 转换</div><div></div><div>YUV 与RGB的转换和缩放，一般在低端设备上，要有硬件加速来做，否则CPU吃不消。在如今的高端PC上，可以使用软件来做，libswscale库正为此而 来。libswscale针对X86 CPU已经做了优化，如使用 MMX, SSE, 3DNOW 等 CPU 相关的多媒体指令。</div><div></div><div>static int vfmt2rgb(AVPicture *dst, AVPicture *src)</div><div>{</div><div>&nbsp; &nbsp; static struct SwsContext *img_convert_ctx;</div><div></div><div>&nbsp; &nbsp; img_convert_ctx = sws_getCachedContext(img_convert_ctx,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width, height, src_pic_fmt,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width, height, my_pic_fmt, SWS_X, NULL, NULL, NULL);</div><div></div><div>&nbsp; &nbsp; sws_scale(img_convert_ctx, src-&gt;data, src-&gt;linesize,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, width, dst-&gt;data, dst-&gt;linesize);</div><div></div><div>&nbsp; &nbsp; return 0;</div><div>}</div><div></div><div>比如从 YUV420P 到 RGB24 的转换，只要设置</div><div></div><div>src_pic_fmt = PIX_FMT_YUV420P ;</div><div>my_pic_fmt = PIX_FMT_RGB24 ;</div><div></div><div></div><div>八. 软件缩放</div><div></div><div>软件缩放就可以使用上述的 libswscale 库，调用代码基本一样，只是改一下目标picture的width和height,如放大两倍:</div><div></div><div>static int zoom_2(AVPicture *dst, AVPicture *src)</div><div>{</div><div>&nbsp; &nbsp; static struct SwsContext *img_convert_ctx;</div><div></div><div>&nbsp; &nbsp; img_convert_ctx = sws_getCachedContext(img_convert_ctx,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width, height, src_pic_fmt,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width*2, height*2, my_pic_fmt, SWS_X, NULL, NULL, NULL);</div><div></div><div>&nbsp; &nbsp; sws_scale(img_convert_ctx, src-&gt;data, src-&gt;linesize,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, width*2, dst-&gt;data, dst-&gt;linesize);</div><div></div><div>&nbsp; &nbsp; return 0;</div><div>}</div><img src ="http://www.cppblog.com/Khan/aggbug/198767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-03-24 13:36 <a href="http://www.cppblog.com/Khan/archive/2013/03/24/198767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOS 绘制PDF</title><link>http://www.cppblog.com/Khan/archive/2013/03/18/198566.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Mon, 18 Mar 2013 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/03/18/198566.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198566.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/03/18/198566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198566.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198566.html</trackback:ping><description><![CDATA[<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;-(<span style="color: #0000FF; ">void</span>)createPdf:(UIImage&nbsp;*)img&nbsp;andText:(NSString&nbsp;*)text{<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSArray&nbsp;*paths&nbsp;=&nbsp;NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&nbsp;NSUserDomainMask,&nbsp;YES);<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*saveDirectory&nbsp;=&nbsp;[paths&nbsp;objectAtIndex:0];<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*saveFileName&nbsp;=&nbsp;@"myPDF.pdf";<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*newFilePath&nbsp;=&nbsp;[saveDirectory&nbsp;stringByAppendingPathComponent:saveFileName];<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*filename&nbsp;=&nbsp;[newFilePath&nbsp;UTF8String];<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGRect&nbsp;pageRect&nbsp;=&nbsp;CGRectMake(0,&nbsp;0,&nbsp;612,&nbsp;792);<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;This&nbsp;code&nbsp;block&nbsp;sets&nbsp;up&nbsp;our&nbsp;PDF&nbsp;Context&nbsp;so&nbsp;that&nbsp;we&nbsp;can&nbsp;draw&nbsp;to&nbsp;it</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextRef&nbsp;pdfContext;<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFStringRef&nbsp;path;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFURLRef&nbsp;url;<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFMutableDictionaryRef&nbsp;myDictionary&nbsp;=&nbsp;NULL;<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;a&nbsp;CFString&nbsp;from&nbsp;the&nbsp;filename&nbsp;we&nbsp;provide&nbsp;to&nbsp;this&nbsp;method&nbsp;when&nbsp;we&nbsp;call&nbsp;it</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;=&nbsp;CFStringCreateWithCString&nbsp;(NULL,&nbsp;filename,&nbsp;kCFStringEncodingUTF8);<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;a&nbsp;CFURL&nbsp;using&nbsp;the&nbsp;CFString&nbsp;we&nbsp;just&nbsp;defined</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=&nbsp;CFURLCreateWithFileSystemPath&nbsp;(NULL,&nbsp;path,&nbsp;kCFURLPOSIXPathStyle,&nbsp;0);<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFRelease&nbsp;(path);<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;This&nbsp;dictionary&nbsp;contains&nbsp;extra&nbsp;options&nbsp;mostly&nbsp;for&nbsp;&#8216;signing&#8217;&nbsp;the&nbsp;PDF</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;myDictionary&nbsp;=&nbsp;CFDictionaryCreateMutable(NULL,&nbsp;0,&nbsp;&amp;kCFTypeDictionaryKeyCallBacks,&nbsp;&amp;kCFTypeDictionaryValueCallBacks);<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFDictionarySetValue(myDictionary,&nbsp;kCGPDFContextTitle,&nbsp;CFSTR("My&nbsp;PDF&nbsp;File"));<br />
<span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFDictionarySetValue(myDictionary,&nbsp;kCGPDFContextCreator,&nbsp;CFSTR("My&nbsp;Name"));<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;our&nbsp;PDF&nbsp;Context&nbsp;with&nbsp;the&nbsp;CFURL,&nbsp;the&nbsp;CGRect&nbsp;we&nbsp;provide,&nbsp;and&nbsp;the&nbsp;above&nbsp;defined&nbsp;dictionary</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;pdfContext&nbsp;=&nbsp;CGPDFContextCreateWithURL&nbsp;(url,&nbsp;&amp;pageRect,&nbsp;myDictionary);<br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Cleanup&nbsp;our&nbsp;mess</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CFRelease(myDictionary);<br />
<span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFRelease(url);<br />
<span style="color: #008080; ">29</span>&nbsp;<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Done&nbsp;creating&nbsp;our&nbsp;PDF&nbsp;Context,&nbsp;now&nbsp;it&#8217;s&nbsp;time&nbsp;to&nbsp;draw&nbsp;to&nbsp;it<br />
</span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Starts&nbsp;our&nbsp;first&nbsp;page</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CGContextBeginPage&nbsp;(pdfContext,&nbsp;&amp;pageRect);<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIImage*&nbsp;myUIImage&nbsp;=&nbsp;img;<br />
<span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGImageRef&nbsp;pageImage&nbsp;=&nbsp;[myUIImage&nbsp;CGImage];<br />
<span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextDrawImage(pdfContext,&nbsp;CGRectMake(0,0,([myUIImage&nbsp;size].width)&nbsp;,&nbsp;([myUIImage&nbsp;size].height)),&nbsp;pageImage); //绘制图片<br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Draws&nbsp;a&nbsp;black&nbsp;rectangle&nbsp;around&nbsp;the&nbsp;page&nbsp;inset&nbsp;by&nbsp;50&nbsp;on&nbsp;all&nbsp;sides<br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;CGContextStrokeRect(pdfContext,&nbsp;CGRectMake(50,&nbsp;50,&nbsp;pageRect.size.width&nbsp;-&nbsp;100,&nbsp;pageRect.size.height&nbsp;-&nbsp;100));<br />
</span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Adding&nbsp;some&nbsp;text&nbsp;on&nbsp;top&nbsp;of&nbsp;the&nbsp;image&nbsp;we&nbsp;just&nbsp;added<br />
</span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;CGContextSelectFont&nbsp;(pdfContext,&nbsp;"Helvetica",&nbsp;30,&nbsp;kCGEncodingMacRoman);</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CGContextSetTextDrawingMode&nbsp;(pdfContext,&nbsp;kCGTextFill);<br />
<span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextSetRGBFillColor&nbsp;(pdfContext,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;1);<br />
<span style="color: #008080; ">44</span>&nbsp;<br />
<span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">46</span>&nbsp;<br />
<span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIGraphicsPushContext(pdfContext); &nbsp;//将需要绘制的层push<br />
<span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextTranslateCTM(pdfContext,&nbsp;0,&nbsp;792); &nbsp;//转换Y轴坐标, &nbsp;底层坐标与cocoa 组件不同 Y轴相反<br />
<span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextScaleCTM(pdfContext,&nbsp;1,&nbsp;-1);<br />
<span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">51</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;CGContextShowTextAtPoint&nbsp;(pdfContext,&nbsp;260,&nbsp;390,&nbsp;[text&nbsp;UTF8String],&nbsp;strlen([text&nbsp;UTF8String]));&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">汉字不正常</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[text&nbsp;drawAtPoint:CGPointMake(80,&nbsp;80)&nbsp;withFont:[UIFont&nbsp;systemFontOfSize:18]]; &nbsp;//绘制汉字<br />
<span style="color: #008080; ">54</span>&nbsp;<br />
<span style="color: #008080; ">55</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;UIFont&nbsp;*font&nbsp;=&nbsp;[UIFont&nbsp;systemFontOfSize:15&nbsp;]; //自定义字体<br />
</span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;CGContextSetFillColorWithColor(pdfContext,&nbsp;[UIColor&nbsp;blackColor].CGColor); //颜色<br />
</span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;[text&nbsp;drawAtPoint:CGPointMake(260,390)&nbsp;forWidth:50&nbsp;withFont:font&nbsp;minFontSize:8&nbsp;actualFontSize:NULL&nbsp;lineBreakMode:UILineBreakModeTailTruncation&nbsp;baselineAdjustment:UIBaselineAdjustmentAlignCenters];</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIGraphicsPopContext();&nbsp;<br />
<span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextStrokePath(pdfContext);<br />
<span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;End&nbsp;text<br />
</span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;We&nbsp;are&nbsp;done&nbsp;drawing&nbsp;to&nbsp;this&nbsp;page,&nbsp;let&#8217;s&nbsp;end&nbsp;it<br />
</span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;We&nbsp;could&nbsp;add&nbsp;as&nbsp;many&nbsp;pages&nbsp;as&nbsp;we&nbsp;wanted&nbsp;using&nbsp;CGContextBeginPage/CGContextEndPage</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CGContextEndPage&nbsp;(pdfContext);<br />
<span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;We&nbsp;are&nbsp;done&nbsp;with&nbsp;our&nbsp;context&nbsp;now,&nbsp;so&nbsp;we&nbsp;release&nbsp;it</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CGContextRelease&nbsp;(pdfContext);<br />
<span style="color: #008080; ">70</span>&nbsp;}</div>
<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">1</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)viewDidLoad<br />
<span style="color: #008080; ">2</span>&nbsp;{<br />
<span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;viewDidLoad];<br />
<span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Do&nbsp;any&nbsp;additional&nbsp;setup&nbsp;after&nbsp;loading&nbsp;the&nbsp;view,&nbsp;typically&nbsp;from&nbsp;a&nbsp;nib.<br />
</span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">调用方法</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;[self&nbsp;createPdf:[UIImage&nbsp;imageNamed:@"aa"]&nbsp;andText:@"汉字"];<br />
<span style="color: #008080; ">8</span>&nbsp;&nbsp;<br />
<span style="color: #008080; ">9</span>&nbsp;}</div>
<br />
<br />
没注释掉的代码 每一行都有其意义. 注意步骤, 仔细阅读注释<img src ="http://www.cppblog.com/Khan/aggbug/198566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-03-18 23:10 <a href="http://www.cppblog.com/Khan/archive/2013/03/18/198566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为UITableView增加左右滑动事件</title><link>http://www.cppblog.com/Khan/archive/2013/02/27/198100.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 26 Feb 2013 18:51:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/02/27/198100.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198100.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/02/27/198100.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198100.html</trackback:ping><description><![CDATA[UITableView 屏蔽了左右滑动事件. &nbsp;通过重载的方式可以注入事件touch事件, 供开发者使用..
<div><br />
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;TouchTableView.h<br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;i2fBank4Iphone<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Created&nbsp;by&nbsp;khan.lau&nbsp;on&nbsp;13-1-8.<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2013年&nbsp;khan.lau.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;#import&nbsp;&lt;UIKit/UIKit.h&gt;<br />
<span style="color: #008080; ">10</span>&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;<br />
<span style="color: #008080; ">12</span>&nbsp;@protocol&nbsp;TouchTableViewDelegate&nbsp;&lt;NSObject&gt;<br />
<span style="color: #008080; ">13</span>&nbsp;@optional<br />
<span style="color: #008080; ">14</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)tableView:(UITableView&nbsp;*)tableView&nbsp;touchesBegin:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>;<br />
<span style="color: #008080; ">15</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)tableView:(UITableView&nbsp;*)tableView&nbsp;touchesCancelled:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>;<br />
<span style="color: #008080; ">16</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)tableView:(UITableView&nbsp;*)tableView&nbsp;touchesEnded:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>;<br />
<span style="color: #008080; ">17</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)tableView:(UITableView&nbsp;*)tableView&nbsp;touchesMoved:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>;<br />
<span style="color: #008080; ">18</span>&nbsp;@end</div>
</div>
<div><br />
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;TouchTableView.m<br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;i2fBank4Iphone<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Created&nbsp;by&nbsp;khan.lau&nbsp;on&nbsp;13-1-8.<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2013年&nbsp;khan.lau.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;#import&nbsp;"TouchTableView.h"<br />
<span style="color: #008080; ">10</span>&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;@implementation&nbsp;TouchTableView<br />
<span style="color: #008080; ">12</span>&nbsp;<br />
<span style="color: #008080; ">13</span>&nbsp;@synthesize&nbsp;touchDelegate&nbsp;=&nbsp;_touchDelegate;<br />
<span style="color: #008080; ">14</span>&nbsp;<br />
<span style="color: #008080; ">15</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)touchesBegan:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>&nbsp;{<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesBegan:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;([_touchDelegate&nbsp;conformsToProtocol:@protocol(TouchTableViewDelegate)]&nbsp;&amp;&amp;<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;respondsToSelector:@selector(tableView:touchesBegin:withEvent:)])<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;tableView:self&nbsp;touchesBegin:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">23</span>&nbsp;}<br />
<span style="color: #008080; ">24</span>&nbsp;<br />
<span style="color: #008080; ">25</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)touchesCancelled:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>&nbsp;{<br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesCancelled:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;([_touchDelegate&nbsp;conformsToProtocol:@protocol(TouchTableViewDelegate)]&nbsp;&amp;&amp;<br />
<span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;respondsToSelector:@selector(tableView:touchesCancelled:withEvent:)])<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;tableView:self&nbsp;touchesCancelled:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">33</span>&nbsp;}<br />
<span style="color: #008080; ">34</span>&nbsp;<br />
<span style="color: #008080; ">35</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)touchesEnded:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>&nbsp;{<br />
<span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesEnded:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;([_touchDelegate&nbsp;conformsToProtocol:@protocol(TouchTableViewDelegate)]&nbsp;&amp;&amp;<br />
<span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;respondsToSelector:@selector(tableView:touchesEnded:withEvent:)])<br />
<span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;tableView:self&nbsp;touchesEnded:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">43</span>&nbsp;}<br />
<span style="color: #008080; ">44</span>&nbsp;<br />
<span style="color: #008080; ">45</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)touchesMoved:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>&nbsp;{<br />
<span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesMoved:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;([_touchDelegate&nbsp;conformsToProtocol:@protocol(TouchTableViewDelegate)]&nbsp;&amp;&amp;<br />
<span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;respondsToSelector:@selector(tableView:touchesMoved:withEvent:)])<br />
<span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;tableView:self&nbsp;touchesMoved:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">53</span>&nbsp;}<br />
<span style="color: #008080; ">54</span>&nbsp;<br />
<span style="color: #008080; ">55</span>&nbsp;@end<br />
<span style="color: #008080; ">56</span>&nbsp;</div>
</div>
<div><br />
</div>
<div><br />
</div>
<div>调用方法 :</div>
<div>1. 头文件中加入delegate</div>
<div>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #4f8187; "><span style="color: #bb2ca2">@interface</span><span style="color: #000000"> MoneyViewCtl : </span><span style="color: #703daa">UIViewController</span><span style="color: #000000">&lt;</span><span style="color: #703daa">UITableViewDataSource</span><span style="color: #000000">, </span><span style="color: #703daa">UITableViewDelegate</span><span style="color: #000000">, </span>SDWebDataDownloaderDelegate<span style="color: #000000">, </span>EGORefreshTableHeaderDelegate<span style="color: #000000">, </span>TouchTableViewDelegate<span style="color: #000000">&gt;{</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px; ">&nbsp;&nbsp; &nbsp;</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #703daa; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #bb2ca2">IBOutlet</span><span style="color: #000000"> </span>UISegmentedControl<span style="color: #000000"> *_sigTime;</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">&nbsp; &nbsp; <span style="color: #bb2ca2">IBOutlet</span> <span style="color: #4f8187">TouchTableView</span> *_tableview;</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; "><br />
</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
</div>
<div>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #bb2ca2; ">@end</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #bb2ca2; "><br />
</p>
</div>
<div><br />
</div>
<div>2. .m文件中设置好delegate</div>
<div>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #4f8187; ">_tableview<span style="color: #000000">.</span>touchDelegate<span style="color: #000000"> = </span><span style="color: #bb2ca2">self</span><span style="color: #000000">;</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #4f8187; "><span style="color: #000000"><br />
</span></p>
</div>
<div><br />
</div>
<div>3. .m文件中实现如下事件</div>
<div>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px; "><br />
</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #78492a; ">#pragma mark - TouchTableViewDelegate lifecycle</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">- (<span style="color: #bb2ca2">void</span>)tableView:(<span style="color: #703daa">UITableView</span> *)tableView touchesBegin:(<span style="color: #703daa">NSSet</span> *)touches withEvent:(<span style="color: #703daa">UIEvent</span> *)event{</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #d12f1b; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #3d1d81">NSLog</span><span style="color: #000000">(</span>@"touchesBegin"<span style="color: #000000">);</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">- (<span style="color: #bb2ca2">void</span>)tableView:(<span style="color: #703daa">UITableView</span> *)tableView touchesCancelled:(<span style="color: #703daa">NSSet</span> *)touches withEvent:(<span style="color: #703daa">UIEvent</span> *)event{</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #d12f1b; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #3d1d81">NSLog</span><span style="color: #000000">(</span>@"touchesCancelled"<span style="color: #000000">);</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px; "><br />
</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">- (<span style="color: #bb2ca2">void</span>)tableView:(<span style="color: #703daa">UITableView</span> *)tableView touchesEnded:(<span style="color: #703daa">NSSet</span> *)touches withEvent:(<span style="color: #703daa">UIEvent</span> *)event{</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #d12f1b; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #3d1d81">NSLog</span><span style="color: #000000">(</span>@"touchesEnded"<span style="color: #000000">);</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">- (<span style="color: #bb2ca2">void</span>)tableView:(<span style="color: #703daa">UITableView</span> *)tableView touchesMoved:(<span style="color: #703daa">NSSet</span> *)touches withEvent:(<span style="color: #703daa">UIEvent</span> *)event{</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #d12f1b; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #3d1d81">NSLog</span><span style="color: #000000">(</span>@"touchesMoved"<span style="color: #000000">);</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
</div>
<div><br />
</div>
<div><br />
</div>
<div>剩下的事情就可以自己发挥了</div>
<div><br />
</div>
<div><br />
</div><img src ="http://www.cppblog.com/Khan/aggbug/198100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-02-27 02:51 <a href="http://www.cppblog.com/Khan/archive/2013/02/27/198100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOS GIF播放, 包含UITableViewCell中正常播放</title><link>http://www.cppblog.com/Khan/archive/2013/02/27/198099.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 26 Feb 2013 18:40:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/02/27/198099.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198099.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/02/27/198099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198099.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198099.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本程序依赖第三方库UIImage+animatedImageWithGIF, 但是有小幅度修改&nbsp;1&nbsp;//&nbsp;2&nbsp;//&nbsp;&nbsp;UIImage+animatedImageWithGIF.h&nbsp;3&nbsp;//&nbsp;4&nbsp;//&nbsp;&nbsp;Created&nbsp;by&nbsp;YuAo&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2013/02/27/198099.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/198099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-02-27 02:40 <a href="http://www.cppblog.com/Khan/archive/2013/02/27/198099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg 视频封装步骤</title><link>http://www.cppblog.com/Khan/archive/2012/12/18/196392.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Mon, 17 Dec 2012 16:29:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/18/196392.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196392.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/18/196392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196392.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196392.html</trackback:ping><description><![CDATA[<div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 1、打开你写好的*.264文件，av_open_input_file()；</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 2、找到解码器，avcodec_find_decoder();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 3、设置好编码参数，如宽、高、帧率等等；找到编码器avcodec_find_encoder()，打开编码器avcodec_open();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 4、打开你要写入的文件，比如*avi，url_fopen();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 5、写入流的头信息，av_write_header();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 6、读取帧，av_read_frame();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 7、开始解码，avcodec_decode_video();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 8、随后编码，avcodec_encode_video();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 9、将编码后的数据写入文件（*.avi），av_write_frame();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 10、最后应该是写入尾部信息，av_write_trailer().</span></div><div><span style="font-size: 12px; line-height: normal;"><br /></span></div><div><span style="font-size: 12px; line-height: normal;"><br /></span></div><div><span style="font-size: 12px; line-height: normal;"><br /></span></div><div><span style="font-size: 12px; line-height: normal;">以上为纯视频封装, 音频还需其他步骤.</span></div><img src ="http://www.cppblog.com/Khan/aggbug/196392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-18 00:29 <a href="http://www.cppblog.com/Khan/archive/2012/12/18/196392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C/C++程序里打印调用栈信息(转载)</title><link>http://www.cppblog.com/Khan/archive/2012/12/17/196388.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Mon, 17 Dec 2012 14:12:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/17/196388.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196388.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/17/196388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196388.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196388.html</trackback:ping><description><![CDATA[<div>原文出处 &nbsp;http://blog.csdn.net/yetyongjin/article/details/7759144<br /><br />以下不能windows + mingw下执行. &nbsp;windows下参考&nbsp;http://code.google.com/p/backtrace-mingw/<br /></div><div></div><div></div><div>我们知道，GDB的backtrace命令可以查看堆栈信息。但很多时候，GDB根本用不上。比如说，在线上环境中可能没有GDB，即使有，也不太可能让我们直接在上面调试。如果能让程序自己输出调用栈，那是最好不过了。本文介绍和调用椎栈相关的几个函数。</div><div>&nbsp;</div><div>NAME</div><div>&nbsp; &nbsp; &nbsp; &nbsp;backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging</div><div></div><div>SYNOPSIS</div><div>&nbsp; &nbsp; &nbsp; &nbsp;#include &lt;execinfo.h&gt;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;int backtrace(void **buffer, int size);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;char **backtrace_symbols(void *const *buffer, int size);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;void backtrace_symbols_fd(void *const *buffer, int size, int fd);</div><div>&nbsp;</div><div>以上内容源自这几个函数的man手册。</div><div>&nbsp;</div><div>先简单介绍一下这几个函数的功能：</div><div>l backtrace：获取当前的调用栈信息，结果存储在buffer中，返回值为栈的深度，参数size限制栈的最大深度，即最大取size步的栈信息。</div><div>l backtrace_symbols：把backtrace获取的栈信息转化为字符串，以字符指针数组的形式返回，参数size限定转换的深度，一般用backtrace调用的返回值。</div><div>l backtrace_symbols_fd：它的功能和backtrace_symbols差不多，只不过它不把转换结果返回给调用方，而是写入fd指定的文件描述符。</div><div></div><div>Man手册里，给出了一个简单的实例，我们看一下：</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&lt;execinfo.h&gt;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&lt;stdio.h&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&lt;stdlib.h&gt;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&lt;unistd.h&gt;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;myfunc3(<span style="color: #0000FF; ">void</span>)&nbsp;{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j,&nbsp;nptrs;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;SIZE&nbsp;100<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*buffer[100];<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**strings;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;nptrs&nbsp;=&nbsp;backtrace(buffer,&nbsp;SIZE);<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;printf("backtrace()&nbsp;returned&nbsp;%d&nbsp;addresses\n",&nbsp;nptrs);<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;The&nbsp;call&nbsp;backtrace_symbols_fd(buffer,&nbsp;nptrs,&nbsp;STDOUT_FILENO)<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;would&nbsp;produce&nbsp;similar&nbsp;output&nbsp;to&nbsp;the&nbsp;following:&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;strings&nbsp;=&nbsp;backtrace_symbols(buffer,&nbsp;nptrs);<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(strings&nbsp;==&nbsp;NULL)&nbsp;{<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("backtrace_symbols");<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nptrs;&nbsp;j++)<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;strings[j]);<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;free(strings);<br /><span style="color: #008080; ">25</span>&nbsp;}<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;myfunc2(<span style="color: #0000FF; ">void</span>)&nbsp;{&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;"static"&nbsp;means&nbsp;don't&nbsp;export&nbsp;the&nbsp;symbol<img src="http://www.cppblog.com/Images/dot.gif" alt="" />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;myfunc3();<br /><span style="color: #008080; ">29</span>&nbsp;}<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;myfunc(<span style="color: #0000FF; ">int</span>&nbsp;ncalls)&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ncalls&nbsp;&gt;&nbsp;1)<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfunc(ncalls&nbsp;-&nbsp;1);<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfunc2();<br /><span style="color: #008080; ">36</span>&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>&nbsp;*argv[])&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;!=&nbsp;2)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"%s&nbsp;num-calls\n",&nbsp;argv[0]);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;myfunc(atoi(argv[1]));<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);<br /><span style="color: #008080; ">45</span>&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;</div></div><div>编译:</div><div># cc prog.c -o prog</div><div>&nbsp;</div><div>运行：</div><div># ./prog 0</div><div>backtrace() returned 6 addresses</div><div>./prog() [0x80485a3]</div><div>./prog() [0x8048630]</div><div>./prog() [0x8048653]</div><div>./prog() [0x80486a7]</div><div>&nbsp;</div><div>这样，是输出了调用栈，不过只是以十六进制输出函数地址而已，可读性很差。仔细看下man手册，原来很简单，编译时加上个参数：</div><div>&nbsp;</div><div>重新编译：</div><div># cc -rdynamic &nbsp;prog.c -o prog</div><div>通过gcc手册，我们可以也解下参数的说明:</div><div>-rdynamic</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of "dlopen" or to allow obtaining backtraces from within a program.</div><div>&nbsp;</div><div>再执行：</div><div># ./prog 0</div><div>backtrace() returned 6 addresses</div><div>./prog(myfunc3+0x1f) [0x8048763]</div><div>./prog() [0x80487f0]</div><div>./prog(myfunc+0x21) [0x8048813]</div><div>./prog(main+0x52) [0x8048867]</div><div>/lib/libc.so.6(__libc_start_main+0xe6) [0xaf9cc6]</div><div>./prog() [0x80486b1]</div><div>&nbsp;</div><div>这回，可以看到函数名了。</div><img src ="http://www.cppblog.com/Khan/aggbug/196388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-17 22:12 <a href="http://www.cppblog.com/Khan/archive/2012/12/17/196388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之六(再次探测输入的格式)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196236.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:44:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196236.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196236.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196236.html</trackback:ping><description><![CDATA[<div>void *logctx= ap &amp;&amp; ap-&gt;prealloced_context ? *ic_ptr : NULL; // 因为 ap == NULL, 所以 logctx 也 == NULL.</div>
<div>if (!fmt &amp;&amp; (err = ff_probe_input_buffer(&amp;pb, &amp;fmt, filename, logctx, 0, logctx ? (*ic_ptr)-&gt;probesize : 0)) &lt; 0) {</div>
<div>&nbsp; goto fail;</div>
<div>}</div>
<div>// fmt == NULL 时才执行 ff_probe_input_buffer 函数, 因为 fmt 就等于NULL, 成立.</div>
<div><br />
</div>
<div><br />
</div>
<div>ff_probe_input_buffer函数的原型:</div>
<div>int ff_probe_input_buffer(ByteIOContext **pb, // 字节IO上下文, 执行url_fopen得到的</div>
<div>&nbsp; &nbsp; AVInputFormat **fmt, // 输出参数: 输入的格式</div>
<div>&nbsp; &nbsp; const char *filename, // 文件名</div>
<div>&nbsp; &nbsp; void *logctx, // NULL</div>
<div>&nbsp; &nbsp; unsigned int offset, // 0</div>
<div>&nbsp; &nbsp; unsigned int max_probe_size) // 0</div>
<div><br />
</div>
<div><br />
</div>
<div>关键的代码片断:</div>
<div>/* 读待探测的数据 */</div>
<div>buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);</div>
<div>if ((ret = get_buffer(*pb, buf + buf_offset, probe_size - buf_offset)) &lt; 0) {</div>
<div>&nbsp; /* fail if error was not end of file, otherwise, lower score */</div>
<div>&nbsp; if (ret != AVERROR_EOF) {</div>
<div>&nbsp; &nbsp; av_free(buf);</div>
<div>&nbsp; &nbsp; return ret;</div>
<div>&nbsp; }</div>
<div>&nbsp; score = 0;</div>
<div>&nbsp; ret = 0; /* error was end of file, nothing read */</div>
<div>}</div>
<div>pd.buf_size += ret;</div>
<div>pd.buf = &amp;buf[offset];</div>
<div><br />
</div>
<div>memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);</div>
<div><br />
</div>
<div>/* 猜测文件格式 */</div>
<div>*fmt = av_probe_input_format2(&amp;pd, 1, &amp;score);</div>
<div><br />
</div>
<div>get_buffer函数, 有两处比较关键:</div>
<div>int get_buffer(ByteIOContext *s, unsigned char *buf, int size);</div>
<div>{</div>
<div><br />
</div>
<div>&nbsp; /* 省略部分代码 */ /* 读包 */</div>
<div>&nbsp; if(s-&gt;read_packet)</div>
<div>&nbsp; &nbsp; len = s-&gt;read_packet(s-&gt;opaque, buf, size);</div>
<div><br />
</div>
<div><br />
</div>
<div>&nbsp; /* 省略部分代码 */</div>
<div><br />
</div>
<div>&nbsp; /* 填充缓冲 */</div>
<div><br />
</div>
<div>&nbsp; fill_buffer(s);</div>
<div><br />
</div>
<div>&nbsp; /* 省略部分代码 */</div>
<div><br />
</div>
<div>}</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div>fill_buffer函数, 有一处比较关键:</div>
<div>static void fill_buffer(ByteIOContext *s)</div>
<div>{ /* 省略部分代码 */ /* 读包 */</div>
<div>&nbsp; if(s-&gt;read_packet)</div>
<div>&nbsp; &nbsp; len = s-&gt;read_packet(s-&gt;opaque, dst, len);</div>
<div><br />
</div>
<div>/* 省略部分代码 */</div>
<div>}</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div>好了, 到第二次探测输入格式的地方了:</div>
<div>*fmt = av_probe_input_format2(&amp;pd, 1, &amp;score);</div>
<div><br />
</div>
<div><br />
</div>
<div>进入av_probe_input_format2函数:</div>
<div>AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)</div>
<div>{</div>
<div>&nbsp; AVInputFormat *fmt1, *fmt;</div>
<div>&nbsp; int score;</div>
<div><br />
</div>
<div>&nbsp; fmt = NULL;</div>
<div>&nbsp; for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1-&gt;next) {</div>
<div>&nbsp; &nbsp; if (!is_opened == !(fmt1-&gt;flags &amp; AVFMT_NOFILE))</div>
<div>&nbsp; &nbsp; &nbsp; continue;</div>
<div><br />
</div>
<div>&nbsp; &nbsp; /* 这次 is_opened == 1, fmt1-&gt;flags设置AVFMT_NOFILE标志才时成立 */</div>
<div><br />
</div>
<div>&nbsp; &nbsp; /* 由于 h264_demuxer.flags == AVFMT_GENERIC_INDEX, 所以上面不成立, 继续执行 */ score = 0;</div>
<div>&nbsp; &nbsp; if (fmt1-&gt;read_probe) {</div>
<div>&nbsp; &nbsp; &nbsp; score = fmt1-&gt;read_probe(pd); /* 调用h264_demuxer.h264_probe */</div>
<div>&nbsp; &nbsp; } else if (fmt1-&gt;extensions) {</div>
<div>&nbsp; &nbsp; &nbsp; if (av_match_ext(pd-&gt;filename, fmt1-&gt;extensions)) { /* 文件名和格式扩展名的匹配 */</div>
<div><br />
</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; /* h264_demuxer.extensions = "h26l,h264,264" */ score = 50;</div>
<div>&nbsp; &nbsp; &nbsp; }</div>
<div>&nbsp; &nbsp; }</div>
<div>&nbsp;if (score &gt; *score_max) {</div>
<div>&nbsp; &nbsp; *score_max = score;</div>
<div>&nbsp; &nbsp; fmt = fmt1;</div>
<div>&nbsp; }else if (score == *score_max)</div>
<div>&nbsp; &nbsp; fmt = NULL;</div>
<div>&nbsp; }</div>
<div>&nbsp; return fmt;</div>
<div>}</div>
<div><br />
</div>
<div>av_match_ext函数:</div>
<div>int av_match_ext(const char *filename, const char *extensions)</div>
<div>{</div>
<div>&nbsp; const char *ext, *p;</div>
<div>&nbsp; char ext1[32], *q;</div>
<div><br />
</div>
<div>&nbsp; if(!filename)</div>
<div>&nbsp; &nbsp; return 0;</div>
<div><br />
</div>
<div>&nbsp; ext = strrchr(filename, '.');</div>
<div>&nbsp; if (ext) {</div>
<div>&nbsp; &nbsp; ext++;</div>
<div>&nbsp; &nbsp; p = extensions;</div>
<div>&nbsp; &nbsp; for(;;) {</div>
<div>&nbsp; &nbsp; &nbsp; q = ext1;</div>
<div>&nbsp; &nbsp; &nbsp; while (*p != '' &amp;&amp; *p != ',' &amp;&amp; q-ext1&lt;sizeof(ext1)-1)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; *q++ = *p++;</div>
<div>&nbsp; &nbsp; &nbsp; *q = '';</div>
<div>&nbsp; &nbsp; &nbsp; if (!strcasecmp(ext1, ext))</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; return 1;</div>
<div>&nbsp; &nbsp; &nbsp; if (*p == '')</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; break;</div>
<div>&nbsp; &nbsp; &nbsp; p++;</div>
<div>&nbsp; &nbsp; }</div>
<div>&nbsp; }</div>
<div>&nbsp; return 0;</div>
<div>}</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/Khan/aggbug/196236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:44 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之五(打开输入的文件)  </title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196235.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:34:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196235.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196235.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196235.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196235.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. 打开文件:                                    if&nbsp;(!fmt&nbsp;||&nbsp;!(fmt-&gt;flags&nbsp;&amp;&nbsp;AVFMT_NOFILE))&nbsp;{&nbsp;                        &nbsp;&nbsp; &nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2012/12/14/196235.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/196235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:34 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之四(探测输入的格式)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196234.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:32:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196234.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196234.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196234.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196234.html</trackback:ping><description><![CDATA[<div>调用av_open_input_file(&amp;pFormatCtx, is-&gt;filename, NULL, 0, NULL)函数打开输入的文件.<br /><br /><br /></div><div></div><div>1. 分析一下函数原型:</div><div>int av_open_input_file(AVFormatContext **ic_ptr, // 输出参数: 格式上下文</div><div>&nbsp; &nbsp; const char *filename, // 文件名</div><div>&nbsp; &nbsp; AVInputFormat *fmt, // 输入的格式, 为NULL, 即未知</div><div>&nbsp; &nbsp; int buf_size, // 缓冲的大小, 为0</div><div>&nbsp; &nbsp; AVFormatParameters *ap); // 格式的参数, 为NULL<br /><br /><br /><br /></div><div></div><div>2. 初始化探测数据:</div><div>AVProbeData probe_data, *pd = &amp;probe_data;</div><div></div><div>pd-&gt;filename = "";</div><div>if (filename)</div><div>&nbsp; pd-&gt;filename = filename;</div><div>pd-&gt;buf = NULL;</div><div>pd-&gt;buf_size = 0;<br /><br /><br /><br /></div><div></div><div>3. 探测输入的格式:</div><div>if (!fmt) { // fmt == NULL, 成立</div><div>&nbsp; &nbsp; fmt = av_probe_input_format(pd, 0);</div><div>}<br /><br /><br /><br /></div><div></div><div>进入av_probe_input_format函数:</div><div>AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) {</div><div>&nbsp; &nbsp; int score=0;</div><div>&nbsp; &nbsp; return av_probe_input_format2(pd, is_opened, &amp;score);</div><div>}<br /><br /><br /><br /></div><div></div><div>进入av_probe_input_format2函数:</div><div>AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)</div><div>{</div><div>&nbsp; &nbsp; AVInputFormat *fmt1, *fmt;</div><div>&nbsp; &nbsp; int score;</div><div></div><div>&nbsp; &nbsp; fmt = NULL;</div><div>&nbsp; &nbsp; for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1-&gt;next) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (!is_opened == !(fmt1-&gt;flags &amp; AVFMT_NOFILE)) // is_opened == 0, fmt1-&gt;flags 没有设置 AVFMT_NOFILE 标志时成立</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; /* 省略部分代码 */</div><div>&nbsp; &nbsp; }<br /><br /><br /><br /><br /></div><div></div><div>见libavformat/raw.c文件:</div><div>AVInputFormat h264_demuxer = {</div><div>&nbsp; "h264",</div><div>&nbsp; NULL_IF_CONFIG_SMALL("raw H.264 video format"),</div><div>&nbsp; 0,</div><div>&nbsp; h264_probe,</div><div>&nbsp; video_read_header,</div><div>&nbsp; ff_raw_read_partial_packet,</div><div>&nbsp; .flags= AVFMT_GENERIC_INDEX,</div><div>&nbsp; .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe</div><div>&nbsp; .value = CODEC_ID_H264,</div><div>};<br /><br /><br /></div><div>由于 h264_demuxer.flags == AVFMT_GENERIC_INDEX, 所以上面成立, continue, 返回的 AVInputFormat 指针为 NULL, 探测不成功.</div><img src ="http://www.cppblog.com/Khan/aggbug/196234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:32 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之三(输入输出格式)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196233.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:24:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196233.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196233.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196233.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196233.html</trackback:ping><description><![CDATA[<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 13px; line-height: 18px; text-align: justify; color: #454545; font-family: tahoma, helvetica, arial; ">(不知原始出处, 方便请告知, 此处转载于&nbsp;</span><span style="color: #aaaaaa; font-family: georgia, Verdana, Helvetica, Arial; font-size: 13px; line-height: 18px; text-align: justify; ">http://hi.baidu.com/monkeyifox</span><span style="font-size: 13px; line-height: 18px; text-align: justify; color: #454545; font-family: tahoma, helvetica, arial; ">)</span></div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />
</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">探测数据结构:</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />
</div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; border-collapse: collapse; ">
    <tbody>
        <tr style="font-size: 10pt; ">
            <td style="font-size: 10pt; ">
            <p style="margin-right: 5px; margin-left: 5px; font-size: 10pt; line-height: 19px; "><code><span style="color: #000000; "><span style="color: #ff9900; ">/** This structure contains the data a format has to probe a file. */</span><br style="font-size: 10pt; " />
            <span style="color: #00ff00; ">typedef</span>&nbsp;<span style="color: #00ff00; ">struct</span>&nbsp;AVProbeData&nbsp;<span style="color: #00cc00; ">{</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">const</span>&nbsp;<span style="color: #00ff00; ">char</span>&nbsp;<span style="color: #00cc00; ">*</span>filename<span style="color: #00cc00; ">;</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">unsigned</span>&nbsp;<span style="color: #00ff00; ">char</span>&nbsp;<span style="color: #00cc00; ">*</span>buf<span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #ff9900; ">/**&lt; Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;buf_size<span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #ff9900; ">/**&lt; Size of buf except extra allocated bytes */</span><br style="font-size: 10pt; " />
            <span style="color: #00cc00; ">}</span>&nbsp;AVProbeData<span style="color: #00cc00; ">;</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />
</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; ">h264的探测函数:</span></span></div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #000000; "><span style="color: #00ff00; ">static</span>&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;h264_probe<span style="color: #00cc00; ">(</span>AVProbeData&nbsp;<span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000; ">uint32_t</span>&nbsp;code<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;sps<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">,</span>&nbsp;pps<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">,</span>&nbsp;idr<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">,</span>&nbsp;res<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">,</span>&nbsp;sli<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;i<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">for</span><span style="color: #00cc00; ">(</span>i<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">;</span>&nbsp;i<span style="color: #00cc00; ">&lt;</span>p<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>buf_size<span style="color: #00cc00; ">;</span>&nbsp;i<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">(</span>code<span style="color: #00cc00; ">&lt;</span><span style="color: #00cc00; ">&lt;</span>8<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">+</span>&nbsp;p<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>buf<span style="color: #00cc00; ">[</span>i<span style="color: #00cc00; ">]</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">(</span>code&nbsp;<span style="color: #00cc00; ">&amp;</span>&nbsp;0xffffff00<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;0x100<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;ref_idc<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">(</span>code<span style="color: #00cc00; ">&gt;</span><span style="color: #00cc00; ">&gt;</span>5<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">&amp;</span>3<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;type&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;code&nbsp;<span style="color: #00cc00; ">&amp;</span>&nbsp;0x1F<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">static</span>&nbsp;<span style="color: #00ff00; ">const</span>&nbsp;<span style="color: #ff0000; ">int8_t</span>&nbsp;ref_zero<span style="color: #00cc00; ">[</span>32<span style="color: #00cc00; ">]</span><span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span><span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span><span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span><span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>code&nbsp;<span style="color: #00cc00; ">&amp;</span>&nbsp;0x80<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #ff9900; ">//forbidden bit<br />
            </span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>ref_zero<span style="color: #00cc00; ">[</span>type<span style="color: #00cc00; ">]</span>&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;1&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;ref_idc<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>ref_zero<span style="color: #00cc00; ">[</span>type<span style="color: #00cc00; ">]</span>&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">-</span>1&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;<span style="color: #00cc00; ">!</span>ref_idc<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>ref_zero<span style="color: #00cc00; ">[</span>type<span style="color: #00cc00; ">]</span>&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;2<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">switch</span><span style="color: #00cc00; ">(</span>type<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">case</span>&nbsp;1<span style="color: #00cc00; ">:</span>&nbsp;sli<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00ff00; ">break</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">case</span>&nbsp;5<span style="color: #00cc00; ">:</span>&nbsp;idr<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00ff00; ">break</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">case</span>&nbsp;7<span style="color: #00cc00; ">:</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>p<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>buf<span style="color: #00cc00; ">[</span>i<span style="color: #00cc00; ">+</span>2<span style="color: #00cc00; ">]</span><span style="color: #00cc00; ">&amp;</span>0x0F<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sps<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">break</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">case</span>&nbsp;8<span style="color: #00cc00; ">:</span>&nbsp;pps<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00ff00; ">break</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>sps&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;pps&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;<span style="color: #00cc00; ">(</span>idr<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span>sli<span style="color: #00cc00; ">&gt;</span>3<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;res<span style="color: #00cc00; ">&lt;</span><span style="color: #00cc00; ">(</span>sps<span style="color: #00cc00; ">+</span>pps<span style="color: #00cc00; ">+</span>idr<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;AVPROBE_SCORE_MAX<span style="color: #00cc00; ">/</span>2<span style="color: #00cc00; ">+</span>1<span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #ff9900; ">// +1 for .mpg<br />
            </span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span><br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; ">视频读首部函数:</span></span></div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #000000; "><span style="color: #00ff00; ">static</span>&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;video_read_header<span style="color: #00cc00; ">(</span>AVFormatContext&nbsp;<span style="color: #00cc00; ">*</span>s<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVFormatParameters&nbsp;<span style="color: #00cc00; ">*</span>ap<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;AVStream&nbsp;<span style="color: #00cc00; ">*</span>st<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;st&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;av_new_stream<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">!</span>st<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;AVERROR<span style="color: #00cc00; ">(</span>ENOMEM<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_type&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;AVMEDIA_TYPE_VIDEO<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>iformat<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>value<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>need_parsing&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;AVSTREAM_PARSE_FULL<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* for MJPEG, specify frame rate */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span>ap<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span><span style="color: #ff0000; ">time_base</span><span style="color: #00cc00; ">.</span>num<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span><span style="color: #ff0000; ">time_base</span><span style="color: #00cc00; ">=</span>&nbsp;ap<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span><span style="color: #ff0000; ">time_base</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span>&nbsp;<span style="color: #00ff00; ">else</span>&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span>&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_MJPEG&nbsp;<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_MPEG4&nbsp;<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_DIRAC&nbsp;<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_DNXHD&nbsp;<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_H264<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span><span style="color: #ff0000; ">time_base</span><span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">(</span>AVRational<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">{</span>1<span style="color: #00cc00; ">,</span>25<span style="color: #00cc00; ">}</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;av_set_pts_info<span style="color: #00cc00; ">(</span>st<span style="color: #00cc00; ">,</span>&nbsp;64<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span>&nbsp;1200000<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; ">原始地读实际的包函数:</span></span></div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #000000; "><span style="color: #00ff00; ">int</span>&nbsp;ff_raw_read_partial_packet<span style="color: #00cc00; ">(</span>AVFormatContext&nbsp;<span style="color: #00cc00; ">*</span>s<span style="color: #00cc00; ">,</span>&nbsp;AVPacket&nbsp;<span style="color: #00cc00; ">*</span>pkt<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;ret<span style="color: #00cc00; ">,</span>&nbsp;size<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;RAW_PACKET_SIZE<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span>av_new_packet<span style="color: #00cc00; ">(</span>pkt<span style="color: #00cc00; ">,</span>&nbsp;size<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">&lt;</span>&nbsp;0<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;AVERROR<span style="color: #00cc00; ">(</span>ENOMEM<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pos<span style="color: #00cc00; ">=</span>&nbsp;url_ftell<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pb<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>stream_index&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;get_partial_buffer<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pb<span style="color: #00cc00; ">,</span>&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>data<span style="color: #00cc00; ">,</span>&nbsp;size<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span>ret&nbsp;<span style="color: #00cc00; ">&lt;</span>&nbsp;0<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;av_free_packet<span style="color: #00cc00; ">(</span>pkt<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;ret<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>size&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;ret<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;ret<span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">原始地写包函数:</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />
</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr style="font-size: 10pt; ">
            <td style="font-size: 10pt; ">
            <p style="margin-right: 5px; margin-left: 5px; font-size: 10pt; line-height: 19px; "><code><span style="color: #00ff00; ">static</span>&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;raw_write_packet<span style="color: #00cc00; ">(</span><span style="color: #00ff00; ">struct</span>&nbsp;AVFormatContext&nbsp;<span style="color: #00cc00; ">*</span>s<span style="color: #00cc00; ">,</span>&nbsp;AVPacket&nbsp;<span style="color: #00cc00; ">*</span>pkt<span style="color: #00cc00; ">)</span><br style="font-size: 10pt; " />
            <span style="color: #00cc00; ">{</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;put_buffer<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pb<span style="color: #00cc00; ">,</span>&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>data<span style="color: #00cc00; ">,</span>&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>size<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;put_flush_packet<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pb<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br style="font-size: 10pt; " />
            <span style="color: #00cc00; ">}</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div><span style="font-size: 13px; "><br />
</span></div>
<div><span style="font-size: 13px; ">h264混合器:</span></div>
<div><span style="font-size: 13px; "><br />
</span></div>
<div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr style="font-size: 10pt; ">
            <td style="font-size: 10pt; ">
            <p style="margin-right: 5px; margin-left: 5px; font-size: 10pt; line-height: 19px; "><code>AVOutputFormat h264_muxer&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">{</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0ff0; ">"h264"</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;NULL_IF_CONFIG_SMALL<span style="color: #00cc00; ">(</span><span style="color: #ff0ff0; ">"raw H.264 video format"</span><span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0ff0; ">"h264"</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;0<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;CODEC_ID_NONE<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;CODEC_ID_H264<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;raw_write_packet<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">.</span>flags<span style="color: #00cc00; ">=</span>&nbsp;AVFMT_NOTIMESTAMPS<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            <span style="color: #00cc00; ">}</span><span style="color: #00cc00; ">;</span></code></p>
            <div><code><span style="color: #00cc00; "><br />
            </span></code></div>
            </td>
        </tr>
    </tbody>
</table>
<div><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<div><span style="font-size: 16px; "><span style="font-size: 13px; ">h264分离器:</span></span></div>
<div><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code>AVInputFormat h264_demuxer&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0ff0; ">"h264"</span><span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;NULL_IF_CONFIG_SMALL<span style="color: #00cc00; ">(</span><span style="color: #ff0ff0; ">"raw H.264 video format"</span><span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;0<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;h264_probe<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;video_read_header<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;ff_raw_read_partial_packet<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">.</span>flags<span style="color: #00cc00; ">=</span>&nbsp;AVFMT_GENERIC_INDEX<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">.</span>extensions&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0ff0; ">"h26l,h264,264"</span><span style="color: #00cc00; ">,</span>&nbsp;<span style="color: #ff9900; ">//FIXME remove after writing mpeg4_probe</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">.</span>value&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_H264<span style="color: #00cc00; ">,</span><br />
            <span style="color: #00cc00; ">}</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<div><span style="font-size: 16px; "><span style="font-size: 13px; ">libavformat/allformats.c文件的<span style="font-family: 新宋体; ">av_register_all函数</span>注册了h264分离器和混合器:</span></span></div>
<div><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #00cc00; ">#</span><span style="color: #ff0000; ">define</span>&nbsp;REGISTER_MUXER<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span>&nbsp;\<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">extern</span>&nbsp;AVOutputFormat x<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_muxer<span style="color: #00cc00; ">;</span>&nbsp;\<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>CONFIG_<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>X<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_MUXER<span style="color: #00cc00; ">)</span>&nbsp;av_register_output_format<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">&amp;</span>x<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_muxer<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00cc00; ">}</span><br />
            <br />
            <span style="color: #00cc00; ">#</span><span style="color: #ff0000; ">define</span>&nbsp;REGISTER_DEMUXER<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span>&nbsp;\<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">extern</span>&nbsp;AVInputFormat x<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_demuxer<span style="color: #00cc00; ">;</span>&nbsp;\<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>CONFIG_<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>X<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_DEMUXER<span style="color: #00cc00; ">)</span>&nbsp;av_register_input_format<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">&amp;</span>x<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_demuxer<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00cc00; ">}</span><br />
            <br />
            <span style="color: #00cc00; ">#</span><span style="color: #ff0000; ">define</span>&nbsp;REGISTER_MUXDEMUX<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span>&nbsp;REGISTER_MUXER<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span>&nbsp;REGISTER_DEMUXER<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div><br />
</div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #00ff00; ">void</span>&nbsp;av_register_all<span style="color: #00cc00; ">(</span><span style="color: #00ff00; ">void</span><span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* 省略部分代码 */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* protocols */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;REGISTER_MUXDEMUX&nbsp;<span style="color: #00cc00; ">(</span>H264<span style="color: #00cc00; ">,</span>&nbsp;h264<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* 省略部分代码 */</span><br />
            <span style="color: #00cc00; ">}</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<div><span style="font-size: 16px; "><span style="font-size: 13px; ">把注册格式函数也贴出来吧:</span></span></div>
<div><br />
</div>
</div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #ff9900; ">/** head of registered input format linked list */</span><br />
            AVInputFormat&nbsp;<span style="color: #00cc00; ">*</span>first_iformat&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">;</span><br />
            <span style="color: #ff9900; ">/** head of registered output format linked list */</span><br />
            AVOutputFormat&nbsp;<span style="color: #00cc00; ">*</span>first_oformat&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">;</span></code></p>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #0000cc; "><br />
            </span><span style="color: #00ff00; ">void</span>&nbsp;av_register_input_format<span style="color: #00cc00; ">(</span>AVInputFormat&nbsp;<span style="color: #00cc00; ">*</span>format<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;AVInputFormat&nbsp;<span style="color: #00cc00; ">*</span><span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">&amp;</span>first_iformat<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">while</span>&nbsp;<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">*</span>p&nbsp;<span style="color: #00cc00; ">!</span><span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">)</span>&nbsp;p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>next<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">*</span>p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;format<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;format<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>next&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span><br />
            <br />
            <span style="color: #00ff00; ">void</span>&nbsp;av_register_output_format<span style="color: #00cc00; ">(</span>AVOutputFormat&nbsp;<span style="color: #00cc00; ">*</span>format<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;AVOutputFormat&nbsp;<span style="color: #00cc00; ">*</span><span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">&amp;</span>first_oformat<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">while</span>&nbsp;<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">*</span>p&nbsp;<span style="color: #00cc00; ">!</span><span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">)</span>&nbsp;p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>next<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">*</span>p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;format<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;format<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>next&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/Khan/aggbug/196233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:24 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之二(文件协议)(转载)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196232.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:21:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196232.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196232.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196232.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196232.html</trackback:ping><description><![CDATA[<div><span style="font-size: 13px; line-height: 18px; text-align: justify; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">(不知原始出处, 方便请告知, 此处转载于&nbsp;</span><span style="color: #aaaaaa; font-family: georgia, Verdana, Helvetica, Arial; font-size: 13px; line-height: 18px; text-align: justify; ">http://hi.baidu.com/monkeyifox</span><span style="font-size: 13px; line-height: 18px; text-align: justify; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">)</span></div>
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">
<div><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><br />
</span></div>
URL协议结构:</span>
<p style="margin-right: 5px; margin-left: 5px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; line-height: 19px; font-size: 10pt; "><code>typedef struct URLProtocol {<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;const char *name;<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_open)(URLContext *h, const char *url, int flags);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_read)(URLContext *h, unsigned char *buf, int size);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_write)(URLContext *h, unsigned char *buf, int size);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int64_t (*url_seek)(URLContext *h, int64_t pos, int whence);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_close)(URLContext *h);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;struct URLProtocol *next;<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_read_pause)(URLContext *h, int pause);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int64_t (*url_read_seek)(URLContext *h, int stream_index,<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int64_t timestamp, int flags);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_get_file_handle)(URLContext *h);<br style="font-size: 10pt; " />
} URLProtocol;</code></p>
<code style="color: #454545; background-color: #ffffff; "><br />
</code><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "></span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">libavformat/file.c文件的file协议:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>static int file_open(URLContext *h, const char *filename, int flags)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int access;<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; av_strstart(filename, "file:", &amp;filename);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (flags &amp; URL_RDWR) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access = O_CREAT | O_TRUNC | O_RDWR;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (flags &amp; URL_WRONLY) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access = O_CREAT | O_TRUNC | O_WRONLY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access = O_RDONLY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
#ifdef O_BINARY<br />
&nbsp;&nbsp;&nbsp;&nbsp; access |= O_BINARY;<br />
#endif<br />
&nbsp;&nbsp;&nbsp;&nbsp; fd = open(filename, access, 0666);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (fd == -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return AVERROR(errno);<br />
&nbsp;&nbsp;&nbsp;&nbsp; h-&gt;priv_data = (void *) (intptr_t) fd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}<br />
<br />
static int file_read(URLContext *h, unsigned char *buf, int size)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd = (intptr_t) h-&gt;priv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return read(fd, buf, size);<br />
}<br />
<br />
static int file_write(URLContext *h, unsigned char *buf, int size)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd = (intptr_t) h-&gt;priv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return write(fd, buf, size);<br />
}<br />
<br />
/* XXX: use llseek */<br />
static int64_t file_seek(URLContext *h, int64_t pos, int whence)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd = (intptr_t) h-&gt;priv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (whence == AVSEEK_SIZE) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct stat st;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int ret = fstat(fd, &amp;st);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ret &lt; 0 ? AVERROR(errno) : st.st_size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return lseek(fd, pos, whence);<br />
}<br />
<br />
static int file_close(URLContext *h)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd = (intptr_t) h-&gt;priv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return close(fd);<br />
}<br />
<br />
static int file_get_handle(URLContext *h)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return (intptr_t) h-&gt;priv_data;<br />
}<br />
<br />
URLProtocol file_protocol = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;"file",<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_open,<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_read,<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_write,<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_seek,<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_close,<br />
&nbsp;&nbsp;&nbsp;&nbsp;.url_get_file_handle = file_get_handle,<br />
};<br />
</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">libavformat/allformats.c文件的av_register_all函数注册了file协议:</span>
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>#define REGISTER_PROTOCOL(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern URLProtocol x##_protocol; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_PROTOCOL) av_register_protocol(&amp;x##_protocol); }</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>void av_register_all(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* 省略部分代码 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* protocols */<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_PROTOCOL (FILE, file);<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* 省略部分代码 */<br />
}</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">把注册协议函数也贴出来吧:</span>
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>URLProtocol *first_protocol = NULL;</code></p>
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code><br />
int av_register_protocol(URLProtocol *protocol)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; URLProtocol **p;<br />
&nbsp;&nbsp;&nbsp;&nbsp; p = &amp;first_protocol;<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (*p != NULL) p = &amp;(*p)-&gt;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;*p = protocol;<br />
&nbsp;&nbsp;&nbsp;&nbsp; protocol-&gt;next = NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</code></p>
<img src ="http://www.cppblog.com/Khan/aggbug/196232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:21 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之一(注册该注册的)(转载)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196231.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:18:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196231.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196231.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196231.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196231.html</trackback:ping><description><![CDATA[<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;(不知原始出处, 方便请告知, 此处转载于 </span>http://hi.baidu.com/monkeyifox<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">)</span>
<div><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><br />
</span></div>
<div><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">hello，各位好，本人是一名嵌入式软件工程师，目前正使用ffmpeg开发一款嵌入式多媒体播放器，《ffmpeg分析》系列博文是本人在阅读ffmpeg源代码时所做的笔记，希望对各位有点帮助。分析过程结合下面的例程：&nbsp;&nbsp;&nbsp;&nbsp;</span><a href="http://dranger.com/ffmpeg/tutorial05.c" style="color: #3fa7cb; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">http://dranger.com/ffmpeg/tutorial05.c</a><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;一. 调用av_register_all函数注册所有的格式和编码解码器. 1.1 先调用avcodec_register_all函数注册所有的编码解码器. 1. 下面列出与H264相关的注册:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>&nbsp;&nbsp; // 注册硬件加速器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_HWACCEL (H264_DXVA2, h264_dxva2);<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_HWACCEL (H264_VAAPI, h264_vaapi);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册解码器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_DECODER (H264, h264);<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_DECODER (H264_VDPAU, h264_vdpau);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册编码器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_ENCODER (LIBX264, libx264);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册分析器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_PARSER (H264, h264);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册位流分离器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_BSF (H264_MP4TOANNEXB, h264_mp4toannexb);</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">2. 下面列出注册宏:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>#define REGISTER_HWACCEL(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVHWAccel x##_hwaccel; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_HWACCEL) av_register_hwaccel(&amp;x##_hwaccel); }<br />
<br />
#define REGISTER_ENCODER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVCodec x##_encoder; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_ENCODER) avcodec_register(&amp;x##_encoder); }<br />
<br />
#define REGISTER_DECODER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVCodec x##_decoder; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_DECODER) avcodec_register(&amp;x##_decoder); }<br />
<br />
#define REGISTER_ENCDEC(X,x) REGISTER_ENCODER(X,x); REGISTER_DECODER(X,x)<br />
<br />
#define REGISTER_PARSER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVCodecParser x##_parser; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_PARSER) av_register_codec_parser(&amp;x##_parser); }<br />
<br />
#define REGISTER_BSF(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVBitStreamFilter x##_bsf; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_BSF) av_register_bitstream_filter(&amp;x##_bsf); }</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">3. 分析一下注册函数, 以avcodec_register函数为例:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>void avcodec_register(AVCodec *codec)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; AVCodec **p;<br />
&nbsp;&nbsp;&nbsp;&nbsp; avcodec_init();<br />
&nbsp;&nbsp;&nbsp;&nbsp; p = &amp;first_avcodec;<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (*p != NULL) p = &amp;(*p)-&gt;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;*p = codec;<br />
&nbsp;&nbsp;&nbsp;&nbsp; codec-&gt;next = NULL;<br />
}</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;&nbsp; 可以看到avcodec_register函数把输入的AVCodec连成一个链表, 其它注册函数与之类似, 就不多言了.</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">4. 上面调用了avcodec_init函数:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>void avcodec_init(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;static int initialized = 0;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (initialized != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;&nbsp; initialized = 1;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; dsputil_static_init ();<br />
}</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;&nbsp; 这个函数只会真正执行一次. 5. 上面调用了dsputil_static_init函数:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>av_cold void dsputil_static_init(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int i;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;256;i++) ff_cropTbl[i + MAX_NEG_CROP] = i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;MAX_NEG_CROP;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ff_cropTbl[i] = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ff_cropTbl[i + MAX_NEG_CROP + 256] = 255;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;512;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ff_squareTbl[i] = (i - 256) * (i - 256);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i&lt;64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1;<br />
}</code></p>
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;&nbsp; &nbsp;&nbsp; 可以看到, 它初始化了一些静态数据. 1.2 注册所有的格式和外部库及协议.</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">1. 下面列出与H264相关的注册:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>&nbsp;&nbsp; // 注册分离器和混合器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_MUXDEMUX (H264, h264);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册文件协议<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_PROTOCOL (FILE, file);</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">2. 下面列出注册宏:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>#define REGISTER_MUXER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern AVOutputFormat x##_muxer; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_MUXER) av_register_output_format(&amp;x##_muxer); }<br />
<br />
#define REGISTER_DEMUXER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern AVInputFormat x##_demuxer; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_DEMUXER) av_register_input_format(&amp;x##_demuxer); }<br />
<br />
#define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)<br />
<br />
#define REGISTER_PROTOCOL(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern URLProtocol x##_protocol; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_PROTOCOL) av_register_protocol(&amp;x##_protocol); }</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;&nbsp; 这些注册函数与avcodec_register函数类似, 就不多言了.</span>
@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
</div><img src ="http://www.cppblog.com/Khan/aggbug/196231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:18 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Daemon进程, shell也能搞定</title><link>http://www.cppblog.com/Khan/archive/2012/07/17/183827.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Mon, 16 Jul 2012 23:31:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/07/17/183827.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/183827.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/07/17/183827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/183827.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/183827.html</trackback:ping><description><![CDATA[<div>more guard.sh&nbsp;</div><div>#!/bin/sh</div><div></div><div>while true; do</div><div></div><div>ps ax &gt; /tmp/ps.log</div><div></div><div>if grep 'h2es' /tmp/ps.log ; then</div><div>&nbsp; &nbsp; &nbsp; &nbsp; echo "Found h2es process!"</div><div>else</div><div>&nbsp; &nbsp; &nbsp; &nbsp; echo "Not found h2es process! Restart h2es"</div><div>&nbsp; &nbsp; &nbsp; &nbsp; cd /usr/local/hand2eye/server &amp;&amp; /usr/local/hand2eye/server/h2es</div><div>fi</div><div></div><div>sleep 10</div><div></div><div>done</div><img src ="http://www.cppblog.com/Khan/aggbug/183827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-07-17 07:31 <a href="http://www.cppblog.com/Khan/archive/2012/07/17/183827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOS WSDL2OBJC如何与CXF对接</title><link>http://www.cppblog.com/Khan/archive/2011/11/04/159630.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Fri, 04 Nov 2011 09:36:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2011/11/04/159630.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/159630.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2011/11/04/159630.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/159630.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/159630.html</trackback:ping><description><![CDATA[首先, WSDL2OBJC直接生成的代码是无法正确发送CXF能解析的数据包的
<div><br />
</div>
<div>我懒得去看WSDL2OBJC的源码, 但是由其生成的源码看看倒是ok的</div>
<div><br />
</div>
<div>我wsdl的服务名是HotelPortService</div>
<div>生成的文件中有个HotelPortServiceSvc.m, 要修改的地方全部集中在这个文件</div>
<div>首先, 找到如下代码的位置, 替换掉</div>
<div style="text-align: center;"><br />
</div>
<div>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">- (<span style="color: #7e1aad">NSString</span> *)serializedFormUsingHeaderElements:(<span style="color: #7e1aad">NSDictionary</span> *)headerElements bodyElements:(<span style="color: #7e1aad">NSDictionary</span> *)bodyElements</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">{</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">&nbsp; &nbsp; <span style="color: #7e1aad">xmlDocPtr</span> doc;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #7e4726"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span>doc = </span><span style="color: #490085">xmlNewDoc</span><span style="color: #000000">((</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>XML_DEFAULT_VERSION<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">if</span> (doc == <span style="color: #cb00a5">NULL</span>) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">		</span></span><span style="color: #490085">NSLog</span><span style="color: #000000">(</span>@"Error creating the xml document tree"<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #cb00a5"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">		</span></span>return<span style="color: #000000"> </span><span style="color: #e00005">@""</span><span style="color: #000000">;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #7e1aad">xmlNodePtr</span> root = <span style="color: #490085">xmlNewDocNode</span>(doc, <span style="color: #cb00a5">NULL</span>, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"Envelope"</span>, <span style="color: #cb00a5">NULL</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #490085"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span>xmlDocSetRootElement<span style="color: #000000">(doc, root);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #7e1aad">xmlNsPtr</span><span style="color: #000000"> soapEnvelopeNs = </span><span style="color: #490085">xmlNewNs</span><span style="color: #000000">(root, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"http://schemas.xmlsoap.org/soap/envelope/"<span style="color: #000000">, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"soap"<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #490085">xmlSetNs</span>(root, soapEnvelopeNs);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #7e1aad">xmlNsPtr</span><span style="color: #000000"> xslNs = </span><span style="color: #490085">xmlNewNs</span><span style="color: #000000">(root, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"http://www.w3.org/1999/XSL/Transform"<span style="color: #000000">, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"xsl"<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #490085">xmlNewNs</span><span style="color: #000000">(root, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"http://www.w3.org/2001/XMLSchema-instance"<span style="color: #000000">, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"xsi"<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #490085">xmlNewNsProp</span>(root, xslNs, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"version"</span>, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"1.0"</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #490085">xmlNewNs</span><span style="color: #000000">(root, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"http://www.w3.org/2001/XMLSchema"<span style="color: #000000">, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"xs"<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #490085">xmlNewNs</span><span style="color: #000000">(root, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"http://port.ekezhan.com/"<span style="color: #000000">, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"HotelPortServiceSvc"<span style="color: #000000">);</span><span style="color: #000000; ">//字符串部分根据服务名不同而不同</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">if</span>((headerElements != <span style="color: #cb00a5">nil</span>) &amp;&amp; ([headerElements <span style="color: #490085">count</span>] &gt; <span style="color: #4800de">0</span>)) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #7e1aad">xmlNodePtr</span> headerNode = <span style="color: #490085">xmlNewDocNode</span>(doc, soapEnvelopeNs, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"Header"</span>, <span style="color: #cb00a5">NULL</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #490085">xmlAddChild</span>(root, headerNode);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">		</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #cb00a5">for</span>(<span style="color: #7e1aad">NSString</span> *key <span style="color: #cb00a5">in</span> [headerElements <span style="color: #490085">allKeys</span>]) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">			</span><span style="color: #cb00a5">id</span> header = [headerElements <span style="color: #490085">objectForKey</span>:key];</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #265a5e"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">			</span></span><span style="color: #490085">xmlAddChild</span><span style="color: #000000">(headerNode, [header </span>xmlNodeForDoc<span style="color: #000000">:doc </span>elementName<span style="color: #000000">:key </span>elementNSPrefix<span style="color: #000000">:</span><span style="color: #cb00a5">nil</span><span style="color: #000000">]);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">if</span>((bodyElements != <span style="color: #cb00a5">nil</span>) &amp;&amp; ([bodyElements <span style="color: #490085">count</span>] &gt; <span style="color: #4800de">0</span>)) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #7e1aad">xmlNodePtr</span> bodyNode = <span style="color: #490085">xmlNewDocNode</span>(doc, soapEnvelopeNs, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"Body"</span>, <span style="color: #cb00a5">NULL</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #490085">xmlAddChild</span>(root, bodyNode);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">		</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #cb00a5">for</span>(<span style="color: #7e1aad">NSString</span> *key <span style="color: #cb00a5">in</span> [bodyElements <span style="color: #490085">allKeys</span>]) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">			</span><span style="color: #cb00a5">id</span> body = [bodyElements <span style="color: #490085">objectForKey</span>:key];</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #265a5e"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">			</span></span><span style="color: #490085">xmlAddChild</span><span style="color: #000000">(bodyNode, [body </span>xmlNodeForDoc<span style="color: #000000">:doc </span>elementName<span style="color: #000000">:key </span>elementNSPrefix<span style="color: #000000">:</span><span style="color: #cb00a5">nil</span><span style="color: #000000">]);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #7e1aad">xmlChar</span> *buf;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">int</span> size;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #490085">xmlDocDumpFormatMemory</span>(doc, &amp;buf, &amp;size, <span style="color: #4800de">1</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #490085"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #7e1aad">NSString</span><span style="color: #000000"> *serializedForm = [</span><span style="color: #7e1aad">NSString</span><span style="color: #000000"> </span>stringWithCString<span style="color: #000000">:(</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #cb00a5">char</span><span style="color: #000000">*)buf </span>encoding<span style="color: #000000">:</span>NSUTF8StringEncoding<span style="color: #000000">];</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #7e1aad">xmlFree</span>(buf);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #490085"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span>xmlFreeDoc<span style="color: #000000">(doc);<span class="Apple-tab-span" style="white-space:pre">	</span></span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">return</span> serializedForm;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><br />
</p>
</div>
<div>替换成:</div>
<div>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">- (<span style="color: #7e1aad">NSString</span> *)serializedFormUsingHeaderElements:(<span style="color: #7e1aad">NSDictionary</span> *)headerElements bodyElements:(<span style="color: #7e1aad">NSDictionary</span> *)bodyElements</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">{</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">&nbsp; &nbsp; <span style="color: #7e1aad">xmlDocPtr</span> doc;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #7e4726"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span>doc = </span><span style="color: #490085">xmlNewDoc</span><span style="color: #000000">((</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>XML_DEFAULT_VERSION<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">if</span> (doc == <span style="color: #cb00a5">NULL</span>) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">		</span></span><span style="color: #490085">NSLog</span><span style="color: #000000">(</span>@"Error creating the xml document tree"<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #cb00a5"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">		</span></span>return<span style="color: #000000"> </span><span style="color: #e00005">@""</span><span style="color: #000000">;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #7e1aad">xmlNodePtr</span> root = <span style="color: #490085">xmlNewDocNode</span>(doc, <span style="color: #cb00a5">NULL</span>, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"Envelope"</span>, <span style="color: #cb00a5">NULL</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #490085"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span>xmlDocSetRootElement<span style="color: #000000">(doc, root);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #7e1aad">xmlNsPtr</span><span style="color: #000000"> soapEnvelopeNs = </span><span style="color: #490085">xmlNewNs</span><span style="color: #000000">(root, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"http://schemas.xmlsoap.org/soap/envelope/"<span style="color: #000000">, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"soapenv"<span style="color: #000000">);//此处修改</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #490085">xmlSetNs</span>(root, soapEnvelopeNs);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008c00"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span>//xmlNsPtr xslNs = xmlNewNs(root, (const xmlChar*)"<a href="http://www.w3.org/1999/XSL/Transform"><span style="color: #4900ff">http://www.w3.org/1999/XSL/Transform</span></a>", (const xmlChar*)"xsl");</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008c00"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span>//xmlNewNs(root, (const xmlChar*)"<a href="http://www.w3.org/2001/XMLSchema-instance"><span style="color: #4900ff">http://www.w3.org/2001/XMLSchema-instance</span></a>", (const xmlChar*)"xsi");</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008c00"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span>//xmlNewNsProp(root, xslNs, (const xmlChar*)"version", (const xmlChar*)"1.0");</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008c00"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span>//xmlNewNs(root, (const xmlChar*)"<a href="http://www.w3.org/2001/XMLSchema"><span style="color: #4900ff">http://www.w3.org/2001/XMLSchema</span></a>", (const xmlChar*)"xs");</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px">&nbsp;&nbsp; &nbsp;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #490085">xmlNewNs</span><span style="color: #000000">(root, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"http://port.ekezhan.com/"<span style="color: #000000">, (</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #7e1aad">xmlChar</span><span style="color: #000000">*)</span>"port"<span style="color: #000000">);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">if</span>((headerElements != <span style="color: #cb00a5">nil</span>) &amp;&amp; ([headerElements <span style="color: #490085">count</span>] &gt; <span style="color: #4800de">0</span>)) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #7e1aad">xmlNodePtr</span> headerNode = <span style="color: #490085">xmlNewDocNode</span>(doc, soapEnvelopeNs, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"Header"</span>, <span style="color: #cb00a5">NULL</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #490085">xmlAddChild</span>(root, headerNode);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">		</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #cb00a5">for</span>(<span style="color: #7e1aad">NSString</span> *key <span style="color: #cb00a5">in</span> [headerElements <span style="color: #490085">allKeys</span>]) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">			</span><span style="color: #cb00a5">id</span> header = [headerElements <span style="color: #490085">objectForKey</span>:key];</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #265a5e"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">			</span></span><span style="color: #490085">xmlAddChild</span><span style="color: #000000">(headerNode, [header </span>xmlNodeForDoc<span style="color: #000000">:doc </span>elementName<span style="color: #000000">:key </span>elementNSPrefix<span style="color: #000000">:</span><span style="color: #cb00a5">nil</span><span style="color: #000000">]);</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #cb00a5"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #000000">}</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #cb00a5"><span style="color: #000000"><span class="Apple-tab-span" style="white-space: pre; ">	</span>//此处修改</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #cb00a5"><span style="color: #000000; "><span class="Apple-tab-span" style="white-space: pre; ">	</span></span>else</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #cb00a5"><span style="color: #000000; "><span class="Apple-tab-span" style="white-space: pre; ">	</span></span><span style="color: #000000">{ &nbsp;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space: pre; ">	</span><span class="Apple-tab-span" style="white-space: pre; ">	</span><span style="color: #7e1aad">xmlNodePtr</span> headerNode = <span style="color: #490085">xmlNewDocNode</span>(doc, soapEnvelopeNs, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"Header"</span>, <span style="color: #cb00a5">NULL</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #490085">xmlAddChild</span>(root, headerNode);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space: pre; ">	</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">if</span>((bodyElements != <span style="color: #cb00a5">nil</span>) &amp;&amp; ([bodyElements <span style="color: #490085">count</span>] &gt; <span style="color: #4800de">0</span>)) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #7e1aad">xmlNodePtr</span> bodyNode = <span style="color: #490085">xmlNewDocNode</span>(doc, soapEnvelopeNs, (<span style="color: #cb00a5">const</span> <span style="color: #7e1aad">xmlChar</span>*)<span style="color: #e00005">"Body"</span>, <span style="color: #cb00a5">NULL</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #490085">xmlAddChild</span>(root, bodyNode);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">		</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span><span style="color: #cb00a5">for</span>(<span style="color: #7e1aad">NSString</span> *key <span style="color: #cb00a5">in</span> [bodyElements <span style="color: #490085">allKeys</span>]) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">			</span><span style="color: #cb00a5">id</span> body = [bodyElements <span style="color: #490085">objectForKey</span>:key];</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #265a5e"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">			</span></span><span style="color: #490085">xmlAddChild</span><span style="color: #000000">(bodyNode, [body </span>xmlNodeForDoc<span style="color: #000000">:doc </span>elementName<span style="color: #000000">:key </span>elementNSPrefix<span style="color: #000000">:</span><span style="color: #e00005">@"port"</span><span style="color: #000000">]);//此处修改</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">		</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span>}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #7e1aad">xmlChar</span> *buf;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">int</span> size;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #490085">xmlDocDumpFormatMemory</span>(doc, &amp;buf, &amp;size, <span style="color: #4800de">1</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #490085"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span><span style="color: #7e1aad">NSString</span><span style="color: #000000"> *serializedForm = [</span><span style="color: #7e1aad">NSString</span><span style="color: #000000"> </span>stringWithCString<span style="color: #000000">:(</span><span style="color: #cb00a5">const</span><span style="color: #000000"> </span><span style="color: #cb00a5">char</span><span style="color: #000000">*)buf </span>encoding<span style="color: #000000">:</span>NSUTF8StringEncoding<span style="color: #000000">];</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #7e1aad">xmlFree</span>(buf);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px"><span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #490085"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">	</span></span>xmlFreeDoc<span style="color: #000000">(doc);<span class="Apple-tab-span" style="white-space:pre">	</span></span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre">	</span><span style="color: #cb00a5">return</span> serializedForm;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">}</p>
</div>
<div><br />
</div>
<div>替换全部</div>
<div>
<div>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; "><span style="color: #e00005; "><span style="color: #265a5e">elementNSPrefix</span><span style="color: #000000">:</span>@"HotelPortServiceSvc"</span>&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; ">为</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; "><span style="color: #e00005; "><span style="color: #265a5e">elementNSPrefix</span><span style="color: #000000">:</span>nil</span>&nbsp; //字符串部分根据服务名不同而不同</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; "><br />
</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; "><br />
</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; ">替换全部</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; ">
</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000">nodeName = [</span><span style="color: #7e1aad">NSString</span><span style="color: #000000"> </span><span style="color: #490085">stringWithFormat</span><span style="color: #000000">:</span>@"%@:%@"<span style="color: #000000">, </span>@"HotelPortServiceSvc"<span style="color: #000000">, elName];</span><span style="color: #000000; ">//字符串部分根据服务名不同而不同</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000">为</span></p>
<p>&nbsp;</p>
</div>
<div>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000">nodeName = [</span><span style="color: #7e1aad">NSString</span><span style="color: #000000"> </span><span style="color: #490085">stringWithFormat</span><span style="color: #000000">:</span>@"%@"<span style="color: #000000; ">, elName];</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><br />
</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><br />
</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000"><br />
</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000; ">然后再编译运行. 如果没有意外, 就能获得正确的结果了. 文档如有错漏, 欢迎指正补全</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000; "><br />
</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000; "><br />
</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e00005"><span style="color: #000000; ">测试环境&nbsp;</span></p>
</div>
<div>Mac OS 10.6.8, &nbsp;xcode 4.0.1, &nbsp;WSDL2ObjC 0.7 pre1</div>
</div><img src ="http://www.cppblog.com/Khan/aggbug/159630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2011-11-04 17:36 <a href="http://www.cppblog.com/Khan/archive/2011/11/04/159630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于iphone accessory的理解</title><link>http://www.cppblog.com/Khan/archive/2011/10/09/157871.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sun, 09 Oct 2011 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2011/10/09/157871.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/157871.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2011/10/09/157871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/157871.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/157871.html</trackback:ping><description><![CDATA[转载自cocoachina&nbsp;<a href="http://www.cocoachina.com/">http://www.cocoachina.com<br /><br /></a><font class="Apple-style-span" face="Verdana" size="2"><div><div><span style="line-height: normal;">首先，如果我们的应用程序想跟外设传输数据，先要透过iphone的操作系统，也就是iphoneOS，而最开始的认证过程也是在外设和iphoneOS之间发生的，苹果为这个过程提供了一颗认证芯片(这颗芯片的作用是用来让iphoneOS识别这个外设是经过苹果公司承认的，他的通信方式是I2C总线，而且每出一个产品苹果都会收几美元的认证费用，苹果用心何其毒也~~~)</span></div><div><span style="line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IphoneOS承认外设分两个步骤，识别和认证，我们先说说识别过程。</span></div><div><span style="line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 识别过程是使用纯物理连接来实现的，在这个过程中iphone的30pin有三个引脚被用到，分别是Accessory Identify，Accessory Detect，Accessory Power，Accessory Identify接549k欧姆的电阻，告知iphoneOS使用串口通信，Accessory Detect直接接地，告知iphoneOS有外设插入，Accessory Power相当于iphoneOS的信号，待机时这个引脚没有输出，否则会有3.3V的电压输出。如果按照以上连接就完成了识别过程。</span></div><div><span style="line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;下面开始认证过程，认证过程也叫IDPS过程，这些就牵扯到苹果指定的通信协议了，苹果给自己的通信协议起了一个名字叫Lingo，Lingo分好多种有音频的lingo还有显示遥控的lingo，而我们认证使用的lingo叫做General Lingo。可能大家这时有点晕，那我就给大家看一个iphone的命令包。</span></div><div><span style="line-height: normal;">StartIDPS packet</span></div><div><span style="line-height: normal;">Byte &nbsp; &nbsp; Value &nbsp; &nbsp;Comment</span></div><div><span style="line-height: normal;">0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XFF &nbsp; &nbsp;Sync byte（required only for UART serial）</span></div><div><span style="line-height: normal;">1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0X55 &nbsp; &nbsp;Start of packet(SOP)</span></div><div><span style="line-height: normal;">2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XNN &nbsp; &nbsp;Length of packet payload</span></div><div><span style="line-height: normal;">3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0X00 &nbsp; &nbsp;General Lingo</span></div><div><span style="line-height: normal;">4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0X38 &nbsp; &nbsp;StartIDPS</span></div><div><span style="line-height: normal;">5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XNN &nbsp; &nbsp;transID [bit 15:8] Transaction ID&nbsp;</span></div><div><span style="line-height: normal;">6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XNN &nbsp; &nbsp;transID [bit 7:0]</span></div><div><span style="line-height: normal;">7 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XNN &nbsp; &nbsp;校验</span></div><div><span style="line-height: normal;">这是iphone的命令包，大家看到这个应该就明白了。开始IDPS过程首先要发送StartIDPS命令，这样，外设与iphoneOS之间的认证过程就开始了。其中咱们应用中EAAccessory关于一些外设的属性，都是在这个过程中外设发给操作系统的，具体还是大家加入苹果的mfi(made for ipod)，拿到资料后，才能更明白。稍后我会将iphone串口通信的源码发出来。</span></div><div><span style="line-height: normal;"><br /></span></div><div><span style="line-height: normal;">MFI地址：http://developer.apple.com/programs/mfi/<br /><br /><br /><br />以下部分转载自&lt;iphone应用编程指南&gt;</span></div></div></font><span class="Apple-style-span" style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; "><h2 class="jump section2" style="margin-top: 1.75em; font-size: 22px; color: #3c4c6c; padding-bottom: 2px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #5088c5; ">和配件进行通讯</h2><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">在iPhone OS 3.0及之后的系统上，External Accessory<dfn class="pediaLink"><span class="pediaLink" data-header="框架" data-contents="框架是一个包含共享库及相关资源（比如nib文件、图像文件、和头文件）的程序包（即一个具有特定结构的目录）。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Framework.html#//apple_ref/doc/uid/TP40008195-CH56" target="_top" style="color: #3366cc; text-decoration: none; ">框架</a></span></dfn><code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">（ExternalAccessory.framework</code>）提供了一种管道机制，使应用程序可以和iPhone或iPod touch设备的配件进行通讯。通过这种管道，应用程序开发者可以将配件级别的功能集成到自己的程序中。</p><div class="notebox clear" style="clear: both; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #5088c5; border-right-color: #5088c5; border-bottom-color: #5088c5; border-left-color: #5088c5; background-color: #ffffff; margin-top: 1.667em; margin-right: 0px; margin-bottom: 1.75em; margin-left: 0px; padding-right: 0.667em; padding-bottom: 0.083em; padding-left: 0.75em; text-align: left; "><p style="margin-top: 0.583em; margin-bottom: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; "><strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">请注意：</strong>下面部分将向您展示iPhone应用程序如何连接配件。如果您有兴趣成为iPhone或iPod touch配件的开发者，可以在<span class="content_text" style="margin-top: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em; vertical-align: top; "><a href="http://developer.apple.com/" class="browserLink" style="color: #3366cc; text-decoration: none; ">http://developer.apple.com</a></span>网站上找到相应的信息。</p></div><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">为了使用External Accessory框架的接口，您必须将<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">ExternalAccessory.framework</code>加入到Xcode工程，并连接到相应的目标中。此外，还需要在相应的源代码文件的顶部包含一个<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">#import &lt;ExternalAccessory/ExternalAccessory.h&gt;</code>语句，才能访问该框架的类和头文件。有关如何为工程添加框架的更多信息，请参见<em><a href="http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/index.html#//apple_ref/doc/uid/TP40006917" target="_top" style="color: #3366cc; text-decoration: none; ">Xcode工程管理指南</a></em>中的<span class="content_text" style="margin-top: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em; vertical-align: top; "><a href="http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/040-Files_in_Projects/project_files.html#//apple_ref/doc/uid/TP40002666" target="_top" style="color: #3366cc; text-decoration: none; ">工程中的文件</a></span>部分；有关External Accessory框架中类的一般信息，请参见<em><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/ExternalAccessoryFrameworkReference/index.html#//apple_ref/doc/uid/TP40008235" target="_top" style="color: #3366cc; text-decoration: none; ">External Accessory框架参考</a></em>。</p><br /><h3 class="jump section3" style="margin-top: 1.5em; margin-bottom: 0.25em; font-size: 17px; color: #000000; ">配件的基础</h3><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">在和配件进行通讯之前，需要与配件的制造商紧密合作，理解配件提供的服务。制造商必须在配件的硬件中加入显式的支持，才能和iPhone OS进行通讯。作为这种支持的一部分，配件必须支持至少一种命令<strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">协议</strong>，也就是支持一种定制的通讯模式，使配件和应用程序之间可以进行数据传输。苹果并不维护一个协议的注册表，支持何种协议及是否使用其他制造商支持的定制或标准协议是由制造商自行决定的。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">作为和配件制造商通讯的一部分，您必须找出给定的配件支持什么协议。为了避免名字空间发生冲突，协议的名称由反向的DNS字符串来指定，形式是<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">com.apple.myProtocol</code>。这使得每个配件制造商都可以根据自己的需要定义协议，以支持不同的配件产品线。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">应用程序通过打开一个使用指定协议的会话来和配件进行通讯。打开会话的方法是创建一个<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EASession_class/Reference/Reference.html#//apple_ref/occ/cl/EASession" target="_top" style="color: #3366cc; text-decoration: none; ">EASession</a></code>类的实例，该类中包含<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSInputStream_Class/Reference/Reference.html#//apple_ref/occ/cl/NSInputStream" target="_top" style="color: #3366cc; text-decoration: none; ">NSInputStream</a></code>和<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSOutputStream_Class/Reference/Reference.html#//apple_ref/occ/cl/NSOutputStream" target="_top" style="color: #3366cc; text-decoration: none; ">NSOutputStream</a></code>对象，可以和配件进行通讯。通过这些流对象，应用程序可以向配件发送未经加工的数据包，以及接收来自配件的类似数据包。因此，您必须按照期望的协议来理解每个数据包的格式。</p><a name="//apple_ref/doc/uid/TP40007072-CH14-SW26" title="Declaring the Protocols Your Application Supports" style="color: #3366cc; text-decoration: none; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a><h3 class="jump section3" style="margin-top: 1.5em; margin-bottom: 0.25em; font-size: 17px; color: #000000; ">声明应用程序支持的协议</h3><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">能够和配件通讯的应用程序应该在其<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">Info.plist</code>文件中声明支持的协议，使系统知道在相应的配件接入时，该应用程序可以被启动。如果当前没有应用程序可以支持接入的配件，系统可以选择启动App Store并指向支持该设备的应用程序。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">为了声明支持的协议，您必须在应用程序的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">Info.plist</code>文件中包含<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">UISupportedExternalAccessoryProtocols</code>键。该键包含一个字符串<dfn class="pediaLink"><span class="pediaLink" data-header="群体" data-contents="群体是Foundation框架中的一种对象，其主要作用是将对象存储为数组、字典、和集合。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Collection.html#//apple_ref/doc/uid/TP40008195-CH10" target="_top" style="color: #3366cc; text-decoration: none; ">数组</a></span></dfn>，用于标识应用程序支持的通讯协议。您的应用程序可以在这个列表中以任意顺序包含任意数量的协议。系统并不使用这个列表来确定应用程序应该选择哪个协议，而只是用它来确定应用程序是否能够和相应的配件进行通讯。您的代码需要在开始和配件进行对话时选择适当的通讯协议。</p><a name="//apple_ref/doc/uid/TP40007072-CH14-SW27" title="Connecting to an Accessory at Runtime" style="color: #3366cc; text-decoration: none; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a><h3 class="jump section3" style="margin-top: 1.5em; margin-bottom: 0.25em; font-size: 17px; color: #000000; ">在运行时连接配件</h3><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">在配件接入系统并做好通讯准备之前，通过External Accessory框架无法看到配件。当配件变为可见时，您的应用程序就可以获取相应的配件对象，然后用其支持的一或多个协议打开会话。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">共享的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/Reference/Reference.html#//apple_ref/occ/cl/EAAccessoryManager" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessoryManager</a></code>对象为应用程序寻找与之通讯的配件提供主入口点。该类包含一个已经接入的配件对象的数组，您可以对其进行<dfn class="pediaLink"><span class="pediaLink" data-header="枚举" data-contents="枚举是顺序操作某个对象元素的过程&#8212;该对象通常是一个集合&#8212;每个元素最多操作一次，每次操作一个元素。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Enumeration.html#//apple_ref/doc/uid/TP40008195-CH17" target="_top" style="color: #3366cc; text-decoration: none; ">枚举</a></span></dfn>，看看是否存在应用程序支持的配件。<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessory_class/Reference/Reference.html#//apple_ref/occ/cl/EAAccessory" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessory</a></code>对象中的绝大多数信息（比如名称、制造商、和型号信息）都只是用于显示。如果您要确定应用程序是否可以连接一个配件，必须看配件的协议，确认应用程序是否支持其中的某个协议。</p><div class="notebox clear" style="clear: both; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #5088c5; border-right-color: #5088c5; border-bottom-color: #5088c5; border-left-color: #5088c5; background-color: #ffffff; margin-top: 1.667em; margin-right: 0px; margin-bottom: 1.75em; margin-left: 0px; padding-right: 0.667em; padding-bottom: 0.083em; padding-left: 0.75em; text-align: left; "><p style="margin-top: 0.583em; margin-bottom: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; "><strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">请注意：</strong>多个配件对象支持同一协议是可能的。如果发生这种情况，您的代码必须负责选择使用哪个配件对象。</p></div><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">对于给定的配件对象，每次只能有一个指定协议的会话。<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">EAAccessory</code>对象的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessory_class/Reference/Reference.html#//apple_ref/occ/instp/EAAccessory/protocolStrings" target="_top" style="color: #3366cc; text-decoration: none; ">protocolStrings</a></code>属性包含一个<dfn class="pediaLink"><span class="pediaLink" data-header="群体" data-contents="群体是Foundation框架中的一种对象，其主要作用是将对象存储为数组、字典、和集合。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Collection.html#//apple_ref/doc/uid/TP40008195-CH10" target="_top" style="color: #3366cc; text-decoration: none; ">字典</a></span></dfn>，字典的键是配件支持的协议。如果您试图用一个已经在使用的协议创建会话，External Accessory框架就会产生错误。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; "><span class="content_text" style="margin-top: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em; vertical-align: top; ">程序清单8-1</span>展示了如何检查接入配件的列表并从中取得应用程序支持的第一个配件。它为指定的协议创建一个会话，并对会话的输入和输出流进行配置。在这个方法返回会话对象时，已经完成和配件的连接，并可以开始发送和接收数据了。</p><br /><p class="codesample clear" style="margin-top: 1.667em; margin-bottom: -0.85em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; clear: both; "><strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">程序清单8-1&nbsp;&nbsp;</strong>创建和配件的通讯会话<br /><br /></p><div><div>- (EASession *)openSessionForProtocol:(NSString *)protocolString{</div><div>&nbsp; &nbsp; NSArray *accessories = [[EAAccessoryManager sharedAccessoryManager]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;connectedAccessories];</div><div>&nbsp; &nbsp; EAAccessory *accessory = nil;</div><div>&nbsp; &nbsp; EASession *session = nil;</div><div>&nbsp;</div><div>&nbsp; &nbsp; for (EAAccessory *obj in accessories) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if ([[obj protocolStrings] containsObject:protocolString]) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; accessory = obj;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div>&nbsp;</div><div>&nbsp; &nbsp; if (accessory) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; session = [[EASession alloc] initWithAccessory:accessory</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;forProtocol:protocolString];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (session) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session inputStream] setDelegate:self];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;forMode:NSDefaultRunLoopMode];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session inputStream] open];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session outputStream] setDelegate:self];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;forMode:NSDefaultRunLoopMode];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session outputStream] open];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [session autorelease];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; return session;</div><div>}</div></div><p>&nbsp;</p><div class="codesample clear" style="clear: both; font-size: 12px; margin-top: 1.5em; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "></div><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">在配置好输入输出流之后，最好一步就是处理和流相关的数据了。程序清单<span class="content_text" style="margin-top: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em; vertical-align: top; ">8-2</span>展示了在<dfn class="pediaLink"><span class="pediaLink" data-header="委托" data-contents="委托是一种简单而强大的模式。在这种模式中，一个对象可以代表另一个对象进行动作或协调它的行为。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14" target="_top" style="color: #3366cc; text-decoration: none; ">委托</a></span></dfn>方法中处理流事件的基本代码结构。清单中的方法可以响应来自配件输入输出流的事件。当配件向应用程序发送数据时，事件发生表示有数据可供读取；类似地，当配件准备好接收应用程序数据时，也通过事件来表示（当然，您并不一定要等到这个事件发生才向流写出数据，应用程序也可以调用流的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSInputStream_Class/Reference/Reference.html#//apple_ref/occ/instm/NSInputStream/hasBytesAvailable" target="_top" style="color: #3366cc; text-decoration: none; ">hasBytesAvailable</a></code>方法来确认配件是否还能够接收数据）。有关流及如何处理流事件的更多信息，请参见<em><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Streams/index.html#//apple_ref/doc/uid/10000188i" target="_top" style="color: #3366cc; text-decoration: none; ">Cocoa流编程指南</a></em>。</p><br /><p class="codesample clear" style="margin-top: 1.667em; margin-bottom: -0.85em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; clear: both; "><strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">程序清单8-2&nbsp;&nbsp;</strong>处理流事件<br /><br /></p><div><div>// Handle communications from the streams.</div><div>- (void)stream:(NSStream*)theStream handleEvent:(NSStreamEvent)streamEvent{</div><div>&nbsp; &nbsp; switch (streamEvent){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; case NSStreamHasBytesAvailable:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Process the incoming stream data.</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; case NSStreamEventHasSpaceAvailable:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Send the next queued command.</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; default:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; }</div><div>}</div></div><p>&nbsp;</p><div class="codesample clear" style="clear: both; font-size: 12px; margin-top: 1.5em; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "></div><h3 class="jump section3" style="margin-top: 1.5em; margin-bottom: 0.25em; font-size: 17px; color: #000000; ">监控与配件有关的事件</h3><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">当配件接入或断开时，External Accessory框架都可以发送<dfn class="pediaLink"><span class="pediaLink" data-header="通告" data-contents="通告是发给一个或多个观察者对象的消息，目的是通知它们程序中发生的事件。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Notification.html#//apple_ref/doc/uid/TP40008195-CH35" target="_top" style="color: #3366cc; text-decoration: none; ">通告</a></span></dfn>。但是这些通告并不自动发送，如果您的应用程序感兴趣，必须调用EAAccessoryManager类的<a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/Reference/Reference.html#//apple_ref/occ/instm/EAAccessoryManager/registerForLocalNotifications" target="_top" style="color: #3366cc; text-decoration: none; ">registerForLocalNotifications</a>方法来显式请求。当配件接入、认证、并准备好和应用程序进行交互时，框架可以发出一个<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/Reference/Reference.html#//apple_ref/c/data/EAAccessoryDidConnectNotification" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessoryDidConnectNotification</a></code>通告；而当配件断开时，框架则可以发送一个<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/Reference/Reference.html#//apple_ref/c/data/EAAccessoryDidDisconnectNotification" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessoryDidDisconnectNotification</a></code>通告。您可以通过缺省的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html#//apple_ref/occ/cl/NSNotificationCenter" target="_top" style="color: #3366cc; text-decoration: none; ">NSNotificationCenter</a></code>来注册接收这些通告。两种通告都包含受影响的配件的信息。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">除了通过缺省的通告中心接收通告之外，当前正在和配件进行交互的应用程序可以为相应的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">EAAccessory</code>对象分配一个<dfn class="pediaLink"><span class="pediaLink" data-header="委托" data-contents="委托是一种简单而强大的模式。在这种模式中，一个对象可以代表另一个对象进行动作或协调它的行为。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14" target="_top" style="color: #3366cc; text-decoration: none; ">委托</a></span></dfn>，使它在发生变化的时候得到通知。委托对象必须遵循<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryDelegate_protocol/Reference/Reference.html#//apple_ref/occ/intf/EAAccessoryDelegate" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessoryDelegate</a></code><dfn class="pediaLink"><span class="pediaLink" data-header="协议" data-contents="协议用于声明某种编程接口，任何类都可以选择实现这种接口。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Protocol.html#//apple_ref/doc/uid/TP40008195-CH45" target="_top" style="color: #3366cc; text-decoration: none; ">协议</a></span></dfn>，该协议目前包含名为<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryDelegate_protocol/Reference/Reference.html#//apple_ref/occ/intfm/EAAccessoryDelegate/accessoryDidDisconnect:" target="_top" style="color: #3366cc; text-decoration: none; ">accessoryDidDisconnect:</a></code>的可选方法，您可以通过这个方法来接收配件断开通告，而不需要事先配置通告观察者。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">有关如何注册接收通告的更多信息，请参见<em><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Notifications/index.html#//apple_ref/doc/uid/10000043i" target="_top" style="color: #3366cc; text-decoration: none; ">Cocoa通告编程主题</a></em>。</p></span><font class="Apple-style-span" face="Verdana" size="2"><div><div><span style="line-height: normal;"><br /><br /></span></div></div></font><img src ="http://www.cppblog.com/Khan/aggbug/157871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2011-10-09 14:47 <a href="http://www.cppblog.com/Khan/archive/2011/10/09/157871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ios5 xcode 4.2 中 release 显示编译警告或错误的解决方法</title><link>http://www.cppblog.com/Khan/archive/2011/07/21/151559.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 21 Jul 2011 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2011/07/21/151559.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/151559.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2011/07/21/151559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/151559.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/151559.html</trackback:ping><description><![CDATA[<span style="font-family: Arial; line-height: 26px; color: #333333; ">
<p><span style="color: red; ">由于 iOS5 xcode4.2 引入了ARC (AutomicReferenceCounting) ， 使用xcode4.2 新建项目时，会有一些小小的变化。</span></p>
<p><span style="color: red; ">&nbsp;&nbsp; NSAutoReleasePool&nbsp; 被&nbsp;@&nbsp;</span><span style="color: red; ">{Autoreleasepool</span>&nbsp;<span style="font-style: italic; color: red; ">/ / Code for autoreleasepool</span>&nbsp;<span style="color: red; ">}</span><span style="color: red; ">&nbsp;block 取代了。</span></p>
<p><span style="color: red; ">&nbsp; 新增了__strong , __weak 编译指令。</span></p>
<p><span style="color: red; ">&nbsp; 如果需要在项目中关闭 ARC 功能，在项目属性中将CLANG_ENABLE_OBJC_ARC&nbsp; 设置为NO即可。否则在编译时，会对 release ,retainCount, retain 等内存相关操作在编译时出现红色警告。</span></p>
<p><br />
</p>
<p><br />
</p>
<p><span style="color: red; ">先不讨论这arc这死人东西好不好. &nbsp;去掉先, &nbsp;不当小白鼠</span></p>
</span><img src ="http://www.cppblog.com/Khan/aggbug/151559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2011-07-21 16:44 <a href="http://www.cppblog.com/Khan/archive/2011/07/21/151559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OCI for Windows 环境手工配置</title><link>http://www.cppblog.com/Khan/archive/2010/03/23/110361.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 23 Mar 2010 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2010/03/23/110361.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/110361.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2010/03/23/110361.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/110361.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/110361.html</trackback:ping><description><![CDATA[本来公司的项目是在linux下处理的. 由于近期人员调动. 需要增加几个新人. 为了让不熟悉linux开发环境的新人能够尽快上手使用公司的基础类库, 所以我承担了搭建windows下的开发环境搭建工作<br><br>其中第一项就是将公司使用的基于oci的封装ocicpp编译出一个mingw32的版本<br><br>1. 必要工具<br>
<h1><span class="topstoryhead">Instant Client Downloads</span><span class="parahead2"> for Microsoft Windows<br></span></h1>
http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html<br>oracle instant Client<br><br>
<h1><span class="parahead2">mingw32</span></h1>
自行搜索下载地址, 本人使用3.42<br>gcc的win32版本<br><br>
<h1><span class="parahead2"> pexports for mingw32</span></h1>
自行搜索下载地址<br>将c的dll导出为def的工具, 如果你的mingw没有自带. 请自行下载. 并放到path可以找到的地方, 不支持c++的dll. <br><br>以上工具自行安装<br>instantclient解压到D:\Develop\Cplus\instantclient_11_1\<br>mingw32安装到D:\Develop\Cplus\MinGW\<br>pexports.exe解压到D:\Develop\Cplus\MinGW\bin\<br><br><br>2. 生成能被mingw32调用的oci lib<br>由于oracle 官方的oci sdk并无提供可供mingw link的包. 所以我们需要手工根据dll做一个<br><br>使用dll产生mingw32的lib<br>导出def<br>D:\Develop\Cplus\instantclient_11_1\sdk\lib&gt;pexports oci.dll &gt; oci.def<br><br>生成lib<br>D:\Develop\Cplus\instantclient_11_1\sdk\lib&gt;dlltool --dllname oci.dll --def oci.def --output-lib liboci.a<br><br>这样我们就有了一个可以mingw32 link的 liboci.a了<br><br><br>3.配置oracle instant Client<br>只需要3个环境变量<br>TNS_ADMIN=D:\Develop\Cplus\instantclient_11_1<br>NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK<br>PATH=%PATH%;%TNS_ADMIN%\<br><br><br>4.编译执行测试程序.<br>保密协议导致我无法公开ocicpp的源码.<br>但是可以贴基于ocicpp的测试程序<br><br>#include &lt;unistd.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;iostream&gt;<br>#include "ocicpp/ocicpp.h"<br>#include "ocicpp/db.h"<br><br>using&nbsp;&nbsp;&nbsp; namespace&nbsp;&nbsp;&nbsp; OCICPP;<br><br><br>bool InsertDataBySQL(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br><br>&nbsp;&nbsp;&nbsp; strSQL = "INSERT INTO testOCICPP (TestId, UserName, PassWord, Address ) VALUES(13, 'xxxxx', '!@#$1234', 'xxxxx')";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;execQuery(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;transCommit();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "InsertDataBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>bool UpdateDataBySQL(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br><br>&nbsp;&nbsp;&nbsp; strSQL = "UPDATE testOCICPP SET PassWord = '&amp;*()7890'";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;execQuery(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;transCommit();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "UpdateDataBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>bool DelRecordBySQL(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br><br>&nbsp;&nbsp;&nbsp; strSQL = "DELETE FROM testOCICPP";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;execQuery(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;transCommit();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "DelRecordBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br>bool FetchDataBySQL(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br><br>&nbsp;&nbsp;&nbsp; strSQL = "SELECT MEMBERID,MOBILE,PASSWD,ADDRESS FROM tblmember where rownum&lt;20";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;execQuery(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (cursor.fetch())&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; ".......... Record .........." &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "TestId: " &lt;&lt; cursor.getInt("MEMBERID") &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "UserName: " &lt;&lt; cursor.getStr("MOBILE") &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "PassWord: " &lt;&lt; cursor.getStr("PASSWD") &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "Address: " &lt;&lt; cursor.getStr("ADDRESS") &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;transCommit();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "FetchDataBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>bool InsertDataByProcedure(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br>&nbsp;&nbsp;&nbsp; int iRetCode=0;<br>&nbsp;&nbsp;&nbsp; strSQL = "BEGIN testProcInsert(13, 'xxxxx', '!@#$1234', 'xxxxx', :RetCode); END;";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;prepare(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.bind(":RetCode", iRetCode);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.execute();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "InsertDataBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; "InsertDataByProcedure RetCode: " &lt;&lt; iRetCode &lt;&lt; endl;<br><br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>bool UpdateDataByProcedure(Connection* pConn)<br>{<br><br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br>bool DelRecordByProcedure(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br><br>bool FetchDataByProcedure(Connection* pConn)<br>{<br><br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br>int StartRun(int p_iMode)<br>{<br>&nbsp;&nbsp;&nbsp; Connection&nbsp;&nbsp;&nbsp; dbConn;<br><br>&nbsp;&nbsp;&nbsp; OCICPP::db::init();<br><br>&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OCICPP::db::connect("smsdb", "point", "point1234", dbConn);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(p_iMode)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 1:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InsertDataBySQL(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 2:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UpdateDataBySQL(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 3:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DelRecordBySQL(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 4:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FetchDataBySQL(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 5:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InsertDataByProcedure(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 6:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UpdateDataByProcedure(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 7:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DelRecordByProcedure(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 8:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FetchDataByProcedure(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; } catch(OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "OraError Exception: " &lt;&lt; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>int main(int argc, char* argv[])<br>{<br>&nbsp;&nbsp;&nbsp; if (argc != 2)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "Please input run mode (1 - 6): " &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 1:&nbsp; InsertDataBySQL" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 2:&nbsp; UpdateDataBySQL" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 3:&nbsp; DelRecordBySQL" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 4:&nbsp; FetchDataBySQL" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 5:&nbsp; InsertDataByProcedure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 6:&nbsp; UpdateDataByProcedure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 7:&nbsp; DelRecordByProcedure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 8:&nbsp; FetchDataByProcedure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; int iMode = atoi(argv[1]);<br><br>&nbsp;&nbsp;&nbsp; //pid_t iPid;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //iPid = fork();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //if (iPid == 0)<br>&nbsp;&nbsp;&nbsp; //{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; StartRun(iMode);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(0);<br>&nbsp;&nbsp;&nbsp; //}<br>&nbsp;&nbsp;&nbsp; //else if (iPid &lt; 0)<br>&nbsp;&nbsp;&nbsp; //{<br>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Fork Failure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; //}<br>&nbsp;&nbsp;&nbsp; //sleep(3);<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; "................. Finish ................." &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br><br>/*****************************************************************<br>CREATE TABLE testOCICPP<br>(<br>&nbsp;&nbsp;&nbsp; TestId&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; number(10, 0)&nbsp;&nbsp;&nbsp; DEFAULT 1 NOT NULL,<br>&nbsp;&nbsp;&nbsp; UserName&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; varchar2(16)&nbsp;&nbsp;&nbsp; DEFAULT ' ' NOT NULL,<br>&nbsp;&nbsp;&nbsp; PassWord&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; varchar2(16)&nbsp;&nbsp;&nbsp; DEFAULT ' ' NOT NULL,<br>&nbsp;&nbsp;&nbsp; Address&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; varchar2(128)&nbsp;&nbsp;&nbsp; DEFAULT ' ' NOT NULL<br>)tablespace rism_db;<br><br><br>CREATE OR REPLACE PROCEDURE testProcInsert(<br>&nbsp;&nbsp;&nbsp; p_iTestId IN number, p_sUserName IN string, p_sPassWord IN string,<br>&nbsp;&nbsp;&nbsp; p_sAddress IN string, p_iRetCode OUT number)<br>IS<br>BEGIN<br>&nbsp;&nbsp;&nbsp; p_iRetCode := 0;<br>&nbsp;&nbsp;&nbsp; INSERT INTO testOCICPP(TestId, UserName, PassWord, Address)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; VALUES(p_iTestId, p_sUserName, p_sPassWord, p_sAddress);<br>&nbsp;&nbsp;&nbsp; COMMIT;<br><br>&nbsp;&nbsp;&nbsp; EXCEPTION<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WHEN OTHERS THEN<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p_iRetCode := SQLCODE;<br>END;<br>/<br><br><br><br>*****************************************************************/<br><br><br>编译成ocicpp.exe<br><br>此时需要两个dll文件与ocicpp.exe在同一个目录<br>在oracle instant Client安装目录下找到oraociei11.dll oci.dll<br>根据版本不同. oraociei11.dll这个文件名或许会有差异.<br>也可以将俩dll扔到system32目录下<br><br><br>本人服务器端为rhel 3.4 ,数据库环境为9.2.04<br>客户端环境为windows mingw32-gcc3.42<br>  <img src ="http://www.cppblog.com/Khan/aggbug/110361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2010-03-23 17:30 <a href="http://www.cppblog.com/Khan/archive/2010/03/23/110361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tcp/IP数据包分析</title><link>http://www.cppblog.com/Khan/archive/2010/01/21/106122.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 21 Jan 2010 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2010/01/21/106122.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/106122.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2010/01/21/106122.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/106122.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/106122.html</trackback:ping><description><![CDATA[<span style="font-family: courier new;">10:08:51.006836 IP 58.16.246.110.25479 &gt; 58.16.246.220.5016: P 33025:33041(16) ack 33228 win 5840</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0000:&nbsp; 4500 0038 d14f 4000 4006 0805 3a10 f66e&nbsp; E..8.O@.@...:..n</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0010:&nbsp; 3a10 f6dc 6387 1398 2e78 1088 5a1a ac28&nbsp; :...c....x..Z..(</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0020:&nbsp; 5018 16d0 6196 0000 0000 000c 8000 0015&nbsp; P...a...........</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0030:&nbsp; 0000 0000 a716 f4f8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........<br><br style="font-family: courier new;"><span style="font-family: courier new;">IP Header</span><br style="font-family: courier new;"><span style="font-family: courier new;">45</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //协议版本 ipv4&nbsp;&nbsp;&nbsp; 4bit</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IHL位 20字节, 表示IP Header长度 以32bit为除数计算出的IP头部长度&nbsp;&nbsp; 本区域值 = IP头部长度 / 32 最长的IP包头长度可以为480bit</span><br style="font-family: courier new;"><span style="font-family: courier new;">00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 服务类型 Type of Service</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp; &nbsp; Precedence和TOS。定义IP协议包的处理方法，它包含如下子字段</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过程字段(优先权)：3位，设置了数据包的重要性，取值越大数据越重要，取值范围为：0(正常)~ 7（网络控制) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 延迟(时延)字段：1位，取值：0(正常)、1(期特低的延迟) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 流量(吞吐量)字段：1位，取值：0(正常)、1(期特高的流量) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可靠性字段：1位，取值：0(正常)、1(期特高的可靠性) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成本(开销)字段：1位，取值：0(正常)、1(期特最小成本) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 未使用(保留位)：1位,恒设为0</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TOS目前不太使用。而Precedence则用于QOS应用。(TOS字段的详细描述RFC 1340 1349)</span><br style="font-family: courier new;"><span style="font-family: courier new;">00 38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IP数据报文总长</span><br style="font-family: courier new;"><span style="font-family: courier new;" lang="ZH-CN">d1 4f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //标识符(Identifier):长度16比特。该字段和Flags和Fragment Offest字段联合使用，对大的上层数据包进行分段(fragment)操作。如果数据包原始长度超过MTU,那么将他分段为更小的数据包.然后路由器在每片数据包的标志字段打上相同的标记,以便接收设备可以识别出属于一个数据包的分段.分段的数据包不会在数据链路的另外一端重新组合,直到最终目的地才会重组.</span><br style="font-family: courier new;"><span style="font-family: courier new;" lang="ZH-CN">40 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //标记(Flags)：长度3比特&nbsp; 分段序号(Fragment Offset)：长度13比特</span><br style="font-family: courier new;"><span style="font-family: courier new;">40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //TTL</span><br style="font-family: courier new;"><span style="font-family: courier new;" lang="ZH-CN">06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //协议(Protocol)：长度8比特。标识了上层所使用的协议。TCP=06 UDP=17 ICMP=01 其他请查看cat /etc/protocols</span><br style="font-family: courier new;"><span style="font-family: courier new;" lang="ZH-CN">08 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //头部校验(Header Checksum)：长度16位，由于IP包头是变长的，所以提供一个头部校验来保证IP包头中信息的正确性。</span><br style="font-family: courier new;"><span style="font-family: courier new;">3a 10 f6 6e&nbsp;3a 10 f6 dc </span><br style="font-family: courier new;"><br style="font-family: courier new;"><span style="font-family: courier new;">tcp Header</span><br style="font-family: courier new;"><span style="font-family: courier new;">6387&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //src port&nbsp; 本地端口25479</span><br style="font-family: courier new;"><span style="font-family: courier new;">1398&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //dest port 目标端口5016</span><br style="font-family: courier new;"><span style="font-family: courier new;">2e78 1088&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sequence Number 顺序号</span><br style="font-family: courier new;"><span style="font-family: courier new;">5a1a ac28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ack num 确认号</span><br style="font-family: courier new;"><span style="font-family: courier new;">5018&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //tcp头长度 20字节&nbsp;&nbsp; 5018&nbsp; 2进制01010000 00011000</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp; 5 0101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //表示tcp长度 20字节</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp; &nbsp; 0000 00&nbsp;&nbsp;&nbsp;&nbsp; //保留 无意义</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp; &nbsp; 011000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //6bit 标志位</span><br style="font-family: courier new;">
<p style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URG: (Urgent Pointer field significant)紧急指针。用到的时候值为1，用来处理避免TCP数据流中断<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACK: (Acknowledgment fieldsignificant)置1时表示确认号(AcknowledgmentNumber)为合法，为0的时候表示数据段不包含确认信息，确认号被忽略。　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PSH: (Push Function)，PUSH标志的数据，置1时请求的数据段在接收方得到后就可直接送到应用程序，而不必等到缓冲区满时才传送。　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RST: (Reset the connection)用于复位因某种原因引起出现的错误连接，也用来拒绝非法数据和请求。如果接收到RST位时候，通常发生了某些错误。　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYN: (Synchronize sequence numbers)用来建立连接，在连接请求中，SYN=1，ACK=0，连接响应时，SYN=1，ACK=1。即，SYN和ACK来区分 Connection Request和Connection Accepted。　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIN: (No more data from sender)用来释放连接，表明发送方已经没有数据发送了。　</p>
<span style="font-family: courier new;">
16d0 6196 0000 </span><br style="font-family: courier new;"><br style="font-family: courier new;"><span style="font-family: courier new;">data</span><br style="font-family: courier new;"><span style="font-family: courier new;">0000 000c 8000 0015 0000 0000 a716 f4f8&nbsp;&nbsp; //承载的数据体<br><br><br></span>  <img src ="http://www.cppblog.com/Khan/aggbug/106122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2010-01-21 12:38 <a href="http://www.cppblog.com/Khan/archive/2010/01/21/106122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在指定cpu的核心上执行线程</title><link>http://www.cppblog.com/Khan/archive/2009/12/29/104384.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 29 Dec 2009 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2009/12/29/104384.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/104384.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2009/12/29/104384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/104384.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/104384.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: linux windows  指定线程或进程在某个cpu或核心执行&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2009/12/29/104384.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/104384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2009-12-29 16:57 <a href="http://www.cppblog.com/Khan/archive/2009/12/29/104384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL Vector 的遍历删除.</title><link>http://www.cppblog.com/Khan/archive/2009/12/08/102793.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 08 Dec 2009 05:29:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2009/12/08/102793.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/102793.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2009/12/08/102793.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/102793.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/102793.html</trackback:ping><description><![CDATA[Vector 其实就类似动态数组. 事先分配好一定量的内存. 当需要的内存值大于某个阀值. 就重新申请内存. 重新分配. 当小于某个阀值, 也会导致重新分配.(自动收缩部分, stl没有明确规定, 有些库实现了)<br><br>正确: code1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;string&gt; vecFiles;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;string&gt;::iterator&nbsp; it_pos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //@todo 已下载文件过滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); ) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strTmp = *it_pos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判断是否已下载过, 已下载则从列表删除<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_Log &lt;&lt; TIME &lt;&lt; "file:[" &lt;&lt; *it_pos &lt;&lt; "] found "&lt;&lt; END; //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vecFiles.erase(it_pos++);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it_pos++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br><br>正确: code2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;string&gt; vecFiles;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;string&gt;::iterator&nbsp; it_pos;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //@todo 已下载文件过滤<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); ) {&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strTmp = *it_pos;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判断是否已下载过, 已下载则从列表删除<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_Log &lt;&lt; TIME &lt;&lt; "file:[" &lt;&lt; *it_pos &lt;&lt; "] found "&lt;&lt; END; //<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it_pos = vecFiles.erase(it_pos);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it_pos++;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>错误: code3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;string&gt; vecFiles;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;string&gt;::iterator&nbsp; it_pos;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //@todo 已下载文件过滤<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); it_pos++) {&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strTmp = *it_pos;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判断是否已下载过, 已下载则从列表删除<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_Log &lt;&lt; TIME &lt;&lt; "file:[" &lt;&lt; *it_pos &lt;&lt; "] found "&lt;&lt; END; //<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vecFiles.erase(it_pos);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br><br>code3 错误的原因为, vecFiles.erase(it_pos); 当前的it_pos已经被删除了, 再下一次循环的时候 it_pos++, 访问非法内存..<br><br>然后回过头来看code1, vecFiles.erase(it_pos++); 在当前的it_pos已经被删除的时候, it_pos已经指向下一个位置了. 虽然这里逻辑上是错误的. 但是利用c语法的特性产生了一个正确的结果, 算是一个技巧. 不算是一门技术.<br><br>code2, it_pos = vecFiles.erase(it_pos); erase删除的时候, 也返回了下一个指针的位置,我们将这个位置保留了, 所以这种做法也是正确的.<br><br><br>另外一个移植性比较好的做法是remove_if 和一个仿函数.<br><br>仿函数可以是：<br>struct check {<br>&nbsp;&nbsp;&nbsp; check( Object * objDownHis ) : m_obj( objDownHis ) {}<br>&nbsp;&nbsp;&nbsp; check( const check &amp; c ) : m_obj( c.m_obj ) {}<br><br>&nbsp;&nbsp;&nbsp; bool operator()(const string &amp; s) const {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( m_obj-&gt;checkHisList( s.c_str() ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_Log .........<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; Object * m_obj;<br>};<br><br>vecFiles.erase( std::remove_if( vecFile.begin(), vecFile.end(), check( &amp;objDownHis ) );<br><br><br>鸣谢p大, lancey, jackz 排名不分先后.. 全按交流时间顺序...<br> <img src ="http://www.cppblog.com/Khan/aggbug/102793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2009-12-08 13:29 <a href="http://www.cppblog.com/Khan/archive/2009/12/08/102793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图形学基础(一)</title><link>http://www.cppblog.com/Khan/archive/2009/07/14/90067.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 14 Jul 2009 10:05:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2009/07/14/90067.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/90067.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2009/07/14/90067.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/90067.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/90067.html</trackback:ping><description><![CDATA[直线的笛卡尔斜率截距方程为<br>y=m*x+b<br>m直线的斜率<br>b是y轴的截距<br><br>给定线段的两个端点(x1,y1) 和(x2,y2 )可以计算斜率m和截距b<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y2-y1<br>m = ----------<br>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; x2-x1<br><br>b = y1-m*x1<br><br><br>　　斜率，亦称&#8220;角系数&#8221;，表示一条直线相对于横坐标轴的倾斜程度。一条直线与某平面直角坐标系横坐标轴正半轴方向的夹角的正切值即该直线相对于该坐标系的斜率。<br>
如果直线与x轴互相垂直，直角的正切直无穷大，故此直线，不存在斜率。<br>
对于一次函数y=kx+b，k即该函数图像的斜率。<br>
对于任意函数上任意一点，其斜率等于其切线与x轴正方向的夹角，即tan&#945;. <br>
斜率计算：ax+by+c=0中，k=-a/b.<br><br>
<pre>X轴上截距：与X轴交点横坐标。<br>Y轴上截距：与Y轴交点纵坐标。<br>截距是实数，不是&#8220;距离&#8221;，可正可负。<br>截距之和即：X轴上截距与Y轴上截距之和。</pre>
<br><br><br><br> <img src ="http://www.cppblog.com/Khan/aggbug/90067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2009-07-14 18:05 <a href="http://www.cppblog.com/Khan/archive/2009/07/14/90067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>7bit_default_table pud格式7bit编码对应表</title><link>http://www.cppblog.com/Khan/archive/2009/05/08/82240.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Fri, 08 May 2009 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2009/05/08/82240.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/82240.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2009/05/08/82240.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/82240.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/82240.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp; &nbsp;GSM 3.38中定义的pdu格式编码, 其中7bit的部分不光要处理常见的ascii编码, 还要处理一些欧洲字符, 这些字符不在常规的127个ascii字符中, 所以需要如下映射表做一个映射, 另有部分字符与在ascii中的位置不一致, 所以千万要注意. 网上不少山寨代码都忽略协议. 想当然的实现了所谓的pdu编码格式. 忧郁中.    &nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2009/05/08/82240.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/82240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2009-05-08 15:45 <a href="http://www.cppblog.com/Khan/archive/2009/05/08/82240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 进程互斥锁</title><link>http://www.cppblog.com/Khan/archive/2008/12/24/70218.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Wed, 24 Dec 2008 02:45:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2008/12/24/70218.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/70218.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2008/12/24/70218.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/70218.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/70218.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 最开始打算用semaphore实现, <br><br>sem_t waitNonEmpty;<br>int empty=0;&nbsp; <br>sem_init(&amp;waitNonEmpty, 1, empty); /*初始化信号量*/<br><br>sem_wait(&amp;waitNonEmpty);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*是否有"非空资源"*/<br>sem_post(&amp;waitNonEmpty);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*生成一个"非满资源"*/<br>sem_destroy(&amp;waitNonEmpty);<br><br>后来在fc3 redhat7.3下man了sem_init, 第二个参数int pshared <br>The pshared<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argument indicates whether the semaphore is local to the&nbsp; current&nbsp; pro-<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cess&nbsp; ( pshared is zero) or is to be shared between several processes (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pshared is not zero). LinuxThreads currently does not support&nbsp; process-<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shared&nbsp; semaphores,&nbsp; thus&nbsp; sem_init always returns with error ENOSYS if<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pshared is not zero.<br><br>最邪恶的现状出来了, 这俩系统没有实现sem的进程间通信, 如果设置not zero, 会返回ENOSYS的错误...<br>后来找了个redhat Enterprise 4 看了下文档, 貌似又支持了....<br><br>做个记号. 一会儿看看flock<br>fcntl 是唯一符合posix的文件锁<br>
<p><span style="color: #0000ff;">结构体flock的指针</span>
<span style="color: #000000;">：</span>
</p>
<p>struct flcok { <br>&nbsp; short int l_type; /* 锁定的状态*/</p>
<p>&nbsp; //这三个参数用于分段对文件加锁，若对整个文件加锁，则：l_whence=SEEK_SET,l_start=0,l_len=0;<br>&nbsp; short int l_whence;/*决定l_start位置*/ <br>&nbsp; off_t l_start; /*锁定区域的开头位置*/ <br>&nbsp; off_t l_len; /*锁定区域的大小*/<br><br>&nbsp; pid_t l_pid; /*锁定动作的进程*/ <br>
};</p>
<p><br>
l_type 有三种状态: <br>
F_RDLCK 建立一个供读取用的锁定 <br>
F_WRLCK 建立一个供写入用的锁定 <br>
F_UNLCK 删除之前建立的锁定</p>
<br>int fcntl(int fd, int cmd, struct flock *lock);<br>int cmd<br>&nbsp; //F_SETLKW对加锁操作进行阻塞，<br>&nbsp; //F_SETLK不对加锁操作进行阻塞，立即返回<br><br>&nbsp;&nbsp;&nbsp; 当使用F_SETLK宏，不进行阻塞加锁操作时。两个进程有对文件加锁失败的情况出现。<br>&nbsp;&nbsp;&nbsp; 当使用F_SETLKW宏，进行阻塞加锁操作时。两个进程没有文件加锁失败的情况。但是根据进程的输出日志，可以明显看出A进程对文件操作时，B进程停止对文件操作。<br>&nbsp;&nbsp;&nbsp; 测试过程中打开文件使用O_RDWR | O_CREAT | O_APPEND模式，并对文件加写锁。锁对打开文件没有影响，但是对另一进程加锁和写操作有影响。<br>&nbsp; 加锁对同一进程中的多线程无效。同一进程中的多线程对同一文件加锁，后加锁的线程会覆盖前一个线程加的文件锁。<br>&nbsp; fcntl文档中写到，一个进程对一个文件的区域只能加一个类型的锁<br><br><br><br>实现代码如下:<br>//filelock.h<br>#ifndef __FILE_LOCK_HPP__
<br>#define __FILE_LOCK_HPP__<br><br>&nbsp;<br>#ifdef __cplusplus<br>extern "C" {<br>#endif<br><br>&nbsp;<br>int file_lock(int fd);
<br>int file_unlock(int fd);<br>&nbsp;<br>#ifdef __cplusplus<br>}<br>#endif<br>&nbsp;<br>#endif //__FILE_LOCK_HPP__
<br>&nbsp;<br><br>------------------------华丽分割线-----------------------------<br>//filelock.cpp<br>&nbsp;<br>#include &lt;fcntl.h&gt;
<br>#include &lt;unistd.h&gt;
<br>&nbsp;<br>#include "filelock.h";
<br>&nbsp;<br>int file_lock(int fd){
<br>&nbsp; struct flock s_flock;
<br>&nbsp; s_flock.l_type = F_WRLCK;
<br>&nbsp;<br>&nbsp; s_flock.l_whence = SEEK_SET;
<br>&nbsp; s_flock.l_start = 0;
<br>&nbsp; s_flock.l_len = 0;
<br>&nbsp; s_flock.l_pid = getpid();
<br>&nbsp;&nbsp;
<br>&nbsp; //F_SETLKW对加锁操作进行阻塞，
<br>&nbsp; //F_SETLK不对加锁操作进行阻塞，立即返回
<br>&nbsp; return fcntl(fd, F_SETLKW, &amp;s_flock);
<br>}
<br>&nbsp;<br>&nbsp;<br>int file_unlock(int fd){
<br>&nbsp; return fcntl(fd, F_SETLKW, F_UNLCK);
<br>}
<br>&nbsp;<br><br>---------------------------------华丽的分割线--------------------------<br>test.cpp<br>&nbsp;<br>#include "filelock.h"
<br><br>#include &lt;sys/types.h&gt;<br>#include &lt;sys/stat.h&gt;<br>#include &lt;fcntl.h&gt;<br><br>#include &lt;unistd.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;sys/wait.h&gt;<br>#include &lt;errno.h&gt;<br>&nbsp;<br>&nbsp;<br>int main(int argc,char *argv[]) {<br>&nbsp; int pid = -1;<br>&nbsp;<br>&nbsp; int i = 5;<br>&nbsp; while(i--){<br>&nbsp;&nbsp;&nbsp; if ((pid = fork()) &lt; 0) { //fork出错<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; puts("fork1 error");<br>&nbsp;&nbsp;&nbsp; } else if (pid &gt; 0) {//父进程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(5);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (waitpid(pid, NULL, 0) &lt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; puts("waitpid error");<br><br>&nbsp;&nbsp;&nbsp; } else {//子进程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int li_file = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int li_lck_st = -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; li_file = open("tt.txt", O_WRONLY|O_CREAT, 0777);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( li_file &lt; 0 ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("file open error\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("li_file=[%d] pid=[%d]\n", li_file , getpid() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; li_lck_st = file_lock(li_file);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(5);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("li_lck_st=%d pid =%d\n", li_lck_st, getpid() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file_unlock(li_file);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close(li_file);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("close file pid=%d unlock\n", getpid());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br>&nbsp; return 0;
<br>}
<br>&nbsp;<br><br>------------------------------华丽分割线---------------------------<br>//makefile<br><br>#########################################################
<br>#Project: test
<br>#By: Khan.Lau
<br>#Description: test
<br>#########################################################
<br>&nbsp;<br>CC = gcc
<br>CXX = g++
<br>STRIP = strip
<br>AR = ar
<br><br>PROJ = $(shell pwd)<br>DLLPATH = $(shell find $(PROJ) -name *.so*)<br><br>LIBPATH = /usr<br>&nbsp;<br>INCS = -I$(LIBPATH)/include \<br>&nbsp;&nbsp;&nbsp; -I$(PROJ)/src/inc \<br>&nbsp;&nbsp;&nbsp; -I$(PROJ)/src<br><br><br>CXXINCS = -I$(LIBPATH)/include \<br>&nbsp;&nbsp;&nbsp; -I$(LIBPATH)/include/c++/4.3 \<br>&nbsp;&nbsp;&nbsp; -I$(LIBPATH)/include/c++/4.3/backward \<br>&nbsp;&nbsp;&nbsp; -I$(PROJ)/src/inc \<br>&nbsp;&nbsp;&nbsp; -I$(PROJ)/src<br><br>&nbsp;<br>CFLAGS = -g -Wall $(CXXINCS)&nbsp;
<br>#
<br>CONFIGURATION = release<br>#<br>BIN = test.exe<br>#LIB = lib/HuaWeiBsc.a<br>&nbsp;<br>#包路径<br>LIBS = -L$(PROJ)/lib&nbsp; \<br>&nbsp;&nbsp;&nbsp; -L$(LIBPATH)/lib -lz
<br>&nbsp;<br>SRCS = $(wildcard \<br>&nbsp;&nbsp;&nbsp; src/lib/*.cpp \<br>&nbsp;&nbsp;&nbsp; src/kernel/*.cpp)<br><br>&nbsp;<br>OBJBINS = $(SRCS:.cpp=.o)
<br>&nbsp;<br>&nbsp;<br>.c.o:
<br>&nbsp;&nbsp;&nbsp; $(CC) -o $@ -c $&lt; $(CFLAGS) <br>&nbsp;<br>.cpp.o:
<br>&nbsp;&nbsp;&nbsp; $(CXX) -o $@ -c $&lt; $(CFLAGS)&nbsp;
<br>&nbsp;<br>&nbsp;<br>COLORH=echo -en "\033[1;32;40m"
<br>COLORN=echo -en "\033[m"
<br>&nbsp;<br>&nbsp;<br>all : $(BIN)
<br><br>$(BIN) : $(OBJBINS)<br>&nbsp;&nbsp;&nbsp; $(CXX) -o $(CONFIGURATION)/$(BIN) $(OBJBINS) $(LIBS)
<br>&nbsp;&nbsp;&nbsp; @$(COLORN)
&nbsp;&nbsp;&nbsp; $(shell echo "$(BIN) build complete.")
<br>&nbsp;<br>#$(LIB) : $(OBJBINS)<br>#&nbsp;&nbsp;&nbsp; ar rc $(LIB) $(OBJBINS)<br><br>&nbsp;<br>clean :
<br>&nbsp;&nbsp;&nbsp; rm -f $(OBJBINS)
<br>&nbsp;&nbsp;&nbsp; rm -f $(BIN)
<br><br><br>-----------------------------华丽分割线--------------------------<br>测试环境 ubuntu 8.10,&nbsp; redhat 7.3, redhat fc3&nbsp; redhat enterprise 4.6<br>结果: <br>khan@khan-laptop:~/project/filelock/release$ ./test.exe <br>li_file=[3] pid=[10959]<br>li_lck_st=0 pid =10959<br>close file pid=10959 unlock<br>li_file=[3] pid=[10961]<br>li_lck_st=0 pid =10961<br>close file pid=10961 unlock<br>li_file=[3] pid=[10964]<br>li_lck_st=0 pid =10964<br>close file pid=10964 unlock<br>li_file=[3] pid=[10966]<br>li_lck_st=0 pid =10966<br>close file pid=10966 unlock<br>li_file=[3] pid=[10969]<br>li_lck_st=0 pid =10969<br>close file pid=10969 unlock<br><br>  <img src ="http://www.cppblog.com/Khan/aggbug/70218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2008-12-24 10:45 <a href="http://www.cppblog.com/Khan/archive/2008/12/24/70218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>