??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产精品久久久久网站 ,波多野结衣AV无码久久一区,合区精品久久久中文字幕一区 http://www.shnenglu.com/ifeng/zh-cnWed, 07 May 2025 01:14:22 GMTWed, 07 May 2025 01:14:22 GMT60IOS后台在线http://www.shnenglu.com/ifeng/archive/2013/01/24/197526.html冷锋冷锋Thu, 24 Jan 2013 02:40:00 GMThttp://www.shnenglu.com/ifeng/archive/2013/01/24/197526.htmlhttp://www.shnenglu.com/ifeng/comments/197526.htmlhttp://www.shnenglu.com/ifeng/archive/2013/01/24/197526.html#Feedback0http://www.shnenglu.com/ifeng/comments/commentRss/197526.htmlhttp://www.shnenglu.com/ifeng/services/trackbacks/197526.html2.音乐、位|、VOIP可以后台q行?br />3.以VOIPZQ需要在后台保持一条长q接Q先此socket打标记注册,q入后台时此socket会由pȝ托管QAPPq入休眠。ؓ了维持长q接Q?br />pȝ会在最?00U的间隔内唤醒一ơ,有新数据到来时也会唤醒,但是必须?0U内处理完毕Q此Ӟ可以通过本地通知l用戗?br />详细文档参见官方文档。本文仅作笔记?img src ="http://www.shnenglu.com/ifeng/aggbug/197526.html" width = "1" height = "1" />

冷锋 2013-01-24 10:40 发表评论
]]>
FastCGIq行模型学习ȝhttp://www.shnenglu.com/ifeng/archive/2012/01/05/163635.html冷锋冷锋Thu, 05 Jan 2012 08:58:00 GMThttp://www.shnenglu.com/ifeng/archive/2012/01/05/163635.htmlhttp://www.shnenglu.com/ifeng/comments/163635.htmlhttp://www.shnenglu.com/ifeng/archive/2012/01/05/163635.html#Feedback1http://www.shnenglu.com/ifeng/comments/commentRss/163635.htmlhttp://www.shnenglu.com/ifeng/services/trackbacks/163635.html

FastCGI的工作原?/p>

1、Web Server启动时蝲入FastCGIq程理器(IIS ISAPI或Apache Module)

2、FastCGIq程理器自w初始化Q启动多个CGI解释器进E?可见多个php-cgi)q等待来自Web Server的连接?/p>

3、当客户端请求到达Web ServerӞFastCGIq程理器选择q连接到一个CGI解释器。Web serverCGI环境变量和标准输入发送到FastCGI子进Ephp-cgi?/p>

4、FastCGI子进E完成处理后标准输出和错误信息从同一q接q回Web Server。当FastCGI子进E关闭连接时Q请求便告处理完成。FastCGI子进E接着{待q处理来自FastCGIq程理?q行在Web Server?的下一个连接?在CGI模式中,php-cgi在此侉KZ?/p>

在上q情况中Q你可以惌CGI通常有多慢。每一个WebhPHP都必重新解析php.ini、重新蝲入全部扩展ƈ重初始化全部数据l构。用FastCGIQ所有这些都只在q程启动时发生一ơ。一个额外的好处是,持箋数据库连?Persistent database connection)可以工作?

 

q个很容易找到。也Ҏ理解Q但是l?/span>google之后Q发现自q概念又模p了?/span>

比如有些例子?/p>

spawn-fcgi

/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u root -g root -f /usr/bin/php-cgi

 

参数含义如下

 

  1. -f <fcgiapp> 指定调用FastCGI的进E的执行E序位置Q根据系l上所装的PHP的情况具体设|?/span>
  2. -a <addr> l定到地址addr
  3. -p <port> l定到端口port
  4. -s <path> l定到unix socket的\径path
  5. -C <childs> 指定产生的FastCGI的进E数Q默认ؓ5Q仅用于PHPQ?/span>
  6. -P <path> 指定产生的进E的PID文g路径
  7. -u?g FastCGI使用什么n份(-u 用户 -g 用户l)q行QUbuntu下可以用www-dataQ其他的Ҏ情况配置Q如nobody、apache{?/span>

 

刚看?/span>FastCGI原理的时候,我想象中的运行模型是Q前端的反向代理服务器如Nginx收到hQ然后{发给cgiq程Q这?/span>cgiq程?/span>N个,从而实现ƈ发处理。但是接下来搜烦到的C语言实现?/span>FastCGI应用的例子好像又把这个模型给否定了。ƈ?/span>fastcgi是语a无关的,N你要?/span>python写ƈ发?

#include "fcgi_stdio.h"
#include <stdlib.h>
int count;
void initialize(void)
{
    count=0;
}
void main(void)
{
initialize();
 
while (FCGI_Accept() >= 0)   {
   printf("Content-type: text/html“r“n"
     "“r“n"
     "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
     "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
     "Request number %d running on host <i>%s</i>“n",
     ++count, getenv("SERVER_HOSTNAME"));
    }
}

q个代码看不出来有Q何ƈ发处理的部分。比?/span>fork什么的?/span>

 

 

另外一U模型就是有一U叫做FastCGIq程理器的q程Q就像上面说的是理fastcgiq程的进E,h转发到管理器的时候,由它来进行选择相应的应用进E,卡就卡在q了Q这个管理器是怎么来选择q程的啊Q假如我?/span>N个不同逻辑的可执行文gQ它怎么知道要{发给哪个q程呢,google到的fastcgi配置都是针对反向代理的后端也即管理器讄的,没有发现有针对不同逻辑发给不同的应用进E的部分?/span>

 

l箋狂搜Q还是无果,都是cM的文章。网上搜索不到的问题Q要么就是很隑־偏,要么是很简单,单到不g提,很显Ӟ我属于后者。{换思\Q开始考虑假如要自己来实现q个功能的话该怎么办。一步步地推理,在结合搜索到的文章,大概理清了思\Q我的理解如下,不对的地方请指正?/p>

 

1.有一?/span>CGIq程理器,q个理器一般是用第3方的fastcgi开发套Ӟ比如上面提到?/span>spawn-fcgi Q用它可以启动指定可执行文g?/span>N个实例,关于之前选择q程的疑问,q里可以得到解释Q那是多个q程只是同一个可执行文g的实例,假如你想把不同的模块分开生成可执行文件的话估计就得再启动多一个管理器了吧?/span>

 

2.假如你是?/span>python写的fastcgi的应用程序,那么当你用管理器启动?/span>100个实例的时候,也就相当于启动了100?/span>python解析器,如果是用C{静态语a写的话那q好Q只是跟你写的程序大有兟?/span>

 

可能是没有接触过CGIE序的原因,让我对这基本的模型都U结了一下午Q希望这文章能帮些初学者?/span>




冷锋 2012-01-05 16:58 发表评论
]]>
C++变量命名规范http://www.shnenglu.com/ifeng/archive/2011/12/31/163252.html冷锋冷锋Sat, 31 Dec 2011 05:23:00 GMThttp://www.shnenglu.com/ifeng/archive/2011/12/31/163252.htmlhttp://www.shnenglu.com/ifeng/comments/163252.htmlhttp://www.shnenglu.com/ifeng/archive/2011/12/31/163252.html#Feedback0http://www.shnenglu.com/ifeng/comments/commentRss/163252.htmlhttp://www.shnenglu.com/ifeng/services/trackbacks/163252.html阅读全文

冷锋 2011-12-31 13:23 发表评论
]]>
Google C++ 风格指南http://www.shnenglu.com/ifeng/archive/2011/12/31/163244.html冷锋冷锋Sat, 31 Dec 2011 03:12:00 GMThttp://www.shnenglu.com/ifeng/archive/2011/12/31/163244.htmlhttp://www.shnenglu.com/ifeng/comments/163244.htmlhttp://www.shnenglu.com/ifeng/archive/2011/12/31/163244.html#Feedback0http://www.shnenglu.com/ifeng/comments/commentRss/163244.htmlhttp://www.shnenglu.com/ifeng/services/trackbacks/163244.htmlhttp://codinn.com/projects/google-cpp-styleguide/view/headers.html#define

冷锋 2011-12-31 11:12 发表评论
]]>
UIView的旋?/title><link>http://www.shnenglu.com/ifeng/archive/2011/12/21/162548.html</link><dc:creator>冷锋</dc:creator><author>冷锋</author><pubDate>Wed, 21 Dec 2011 11:30:00 GMT</pubDate><guid>http://www.shnenglu.com/ifeng/archive/2011/12/21/162548.html</guid><wfw:comment>http://www.shnenglu.com/ifeng/comments/162548.html</wfw:comment><comments>http://www.shnenglu.com/ifeng/archive/2011/12/21/162548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ifeng/comments/commentRss/162548.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ifeng/services/trackbacks/162548.html</trackback:ping><description><![CDATA[      做过几次有关UIView坐标变换的,但是l常不能得到自己惌的效果,今天把它仔l研I了下。记下来{以后忘记的时候再复习<br /><div><ul style="margin-left: 0.0208in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in; "> <p style="margin:0in;font-size:10.0pt"><span style="font-family:SimSun">重写</span><span style="font-family:Calibri">shouldAutorateToInterfaceOrientation:</span><span style="font-family:SimSun">Q限制某个方?/span><span style="font-family: SimSun; font-size: 10pt; ">会改变原点的位置Q原点会一直保持在左上角,但已l不是原来的左上角了</span></p> <p style="margin:0in;font-family:SimSun;font-size:10.0pt"> </p> <p style="margin:0in;font-size:10.0pt"><span style="font-family:Calibri">setStatusBarOrientation.</span><span style="font-family:SimSun">改变状态栏的方向。它不会改变原点的位|,但会改变键盘的方?/span></p> <p style="margin:0in;font-size:10.0pt"><span style="font-family:SimSun">旋{?/span><span style="font-family:Calibri">self.myview</span><span style="font-family:SimSun">?/span><span style="font-family:Calibri">frame ={0,0,320,50}</span></p> <p style="margin:0in;font-family:SimSun;font-size:10.0pt">CGAffineTransform at =CGAffineTransformMakeRotation(M_PI/2);</p> <p style="margin:0in;font-size:10.0pt"><span style="font-family:SimSun">[self.</span><span style="font-family:Calibri">myview </span><span style="font-family:SimSun">setTransform:at];</span></p> <p style="margin:0in;font-size:10.0pt"><span style="font-family:SimSun">旋{?/span><span style="font-family:Calibri">frame={135,-135,50,320},</span><span style="font-family:SimSun">视图的所有像素旋?/span><span style="font-family: Calibri">90</span><span style="font-family:SimSun">?/span></p> <p style="margin:0in;font-family:宋体;font-size:10.0pt">坐标是相对于父视囄</p> <p style="margin:0in;font-family:宋体;font-size:10.0pt"> </p> <p style="margin:0in;font-size:10.0pt"><span style="font-family:宋体">假如</span><span style="font-family:Calibri">view</span><span style="font-family:宋体">已经转成竖的Q这旉过讄</span><span style="font-family: Calibri">frame</span><span style="font-family:宋体">而不是通过</span><span style="font-family:Calibri">setTransform</span><span style="font-family:宋体">强制成横的话Q会截掉部分囑փ</span></p> <p style="margin:0in;font-family:宋体;font-size:10.0pt"> </p> <p style="margin:0in;font-size:10.0pt"><span style="font-family:宋体">坐标多次变换的合成,要以被变换的</span><span style="font-family:Calibri">view</span><span style="font-family:宋体">的局部坐标系为参照,比如</span></p> <p style="margin-top: 0in; margin-right: 0in; margin-bottom: 0in; margin-left: 0in; font-family: SimSun; font-size: 10pt; "> </p><div style="font-size: 13px; 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: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];<br />UILabel*label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 20)];<br />label.text =@"Test";<br />label.tag=100;<br />[testView addSubview:label];<br />此时?nbsp;frame ={0,0,320,50}</div><p> </p><div><img src="http://www.shnenglu.com/images/cppblog_com/ifeng/未命名图?.png" width="321" height="460" alt="" /> <br /><br /><div title="Print Page Break" style="font-size: 1px; page-break-before: always; vertical-align: middle; height: 1px; background-color: #c0c0c0"> <br /> </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 />-->CGAffineTransform at =CGAffineTransformMakeRotation(M_PI/2);先顺旉旋{90<br />at =CGAffineTransformTranslate(at,200,0);,<br />[self.testView setTransform:at]; </div></div></ul>         <img src="http://www.shnenglu.com/images/cppblog_com/ifeng/未命名图?.png" width="323" height="460" alt="" /><br /><div><p style="margin:0in;font-size:10.0pt"><span style="font-family:SimSun">此时?/span><span style="font-family:Calibri"> frame ={135,65,50,320},</span><span style="font-family:SimSun">可以看到宽高已经反过来了Q?/span><span style="font-family:Calibri">view</span><span style="font-family: SimSun">中的像素方向也改变了Q而如果只是用</span><span style="font-family:Calibri">setFrame</span><span style="font-family:SimSun">来改变宽高的话是不会改变像素方向?/span></p></div><span style="background-color: #eeeeee; font-size: 13px; "> </span><span style="background-color: #eeeeee; font-size: 13px; "> </span><span style="background-color: #eeeeee; font-size: 13px; "> </span><span style="background-color: #eeeeee; font-size: 13px; "> </span><span style="background-color: #eeeeee; font-size: 13px; "> </span><span style="background-color: #eeeeee; font-size: 13px; "> </span><span style="background-color: #eeeeee; font-size: 13px; "> </span><span style="background-color: #eeeeee; font-size: 13px; "> </span></div><img src ="http://www.shnenglu.com/ifeng/aggbug/162548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ifeng/" target="_blank">冷锋</a> 2011-12-21 19:30 <a href="http://www.shnenglu.com/ifeng/archive/2011/12/21/162548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器多U程Ҏ的选择http://www.shnenglu.com/ifeng/archive/2011/11/20/160587.html冷锋冷锋Sun, 20 Nov 2011 14:35:00 GMThttp://www.shnenglu.com/ifeng/archive/2011/11/20/160587.htmlhttp://www.shnenglu.com/ifeng/comments/160587.htmlhttp://www.shnenglu.com/ifeng/archive/2011/11/20/160587.html#Feedback11http://www.shnenglu.com/ifeng/comments/commentRss/160587.htmlhttp://www.shnenglu.com/ifeng/services/trackbacks/160587.html
最q想写个多线E模型的服务器,但是一直纠l要选哪U方式,参考了memcachedQ但是觉得不完美.
备选方案,当然q些都是NIO
1.一个IOU程Q专门处理连接读写数据,一个逻辑U程Q专门处理数据?/div>
2.一个IOU程Q一个线E池Q可L配置U程池的数量?/div>
先考虑1Q假设连接层用epoll的ET模式实现Q当IOU程发生可读事gӞ必须把接收缓冲区的数据全部收完,一直read直到发生EAGAIN错误Q否则就必须自己在上层维护一个可读队列?/div>
Ҏa:每收C个协议包Q就转发l逻辑处理.处理完再接着收取剩下的包。但是TCP是无边界的,有可能收?.5个或?.5个包Q这时你得ؓ每个q接准备个buf,q且每收C包都要跟逻辑U程同步加锁一?q有个很大的弊端是Q连接层已经跟逻辑协议相关了,q似乎不是很好?/div>
Ҏb:IOU程把所有数据都收完再通知逻辑U程。当然这样也无法避免收到半个协议包的情况Q所以我是想l护一个recv到的数据队列QIOU程把每ơ收到的包都丢到q个队列?/div>
a,b2U方法都面着send的麻烦,现在send也有以下Ҏ.
Ҏa.每次需要write的时候就直接send发不完的加到发送队列中厅R在发送前必须要先判断一下队列是不是I,如果不ؓI就必须先处理队列,剩余数据待可M件发生时再处理,   于是脑子中又出现一大堆锁了。有2个线E可能对socketq行写操作?/div>
Ҏb.每次需要send的时候都直接把数据丢到发送队列去Q等到可M件到来时再尽量把队列都发送完。但是响应可能没那么q速了?/div>
q两U方法都必须为每个数据包增加一个标识TCPq接的字D,因ؓsocket fd是可以重复用的Q比如用户Aq接分配的socket?00Q逻辑U程正在为A处理数据Q但是用户A断开q接了,同时立即有另外个用户q接q来q且分配的socket?00Q这时悲剧就发生了?/div>
再考虑下线E池?U情?
a.ȝE负责IOQ包括处理连接,dQ把d的数据加入recv队列Q子U程把需要写的加入send队列.
q个Ҏ有个很大的缺P无法保证先到的请求先q回Q这是很致命的,只能通过客户端来保收到前一个请求的l果以后再发送下一个请求?/div>
b.ȝE只负责监听q接Q收到连接到来事件后Q通知U程池去acceptq接Q因此每个连接的数据都会由同一个线E处理,也就保证了顺序,但是q样的话子线E就必须承担起IO的Q务了Q这样好像就有些分工不清了,q个是memcached中用的方?
PS:用epoll的ET模式需要一直recv,q样有可能是使得z跃的连接占用了全部带宽Q因此需要在上层对连接进行限速,因此也就需要维护可M件了?/div>
U结好几天了Q第一ơ写多线E服务器Q一直ؓ选方案纠l啊Q我本h們֐于线E池Q毕竟可以利用多核的优势啊。不知道大家实际上用的都是什么方案呢Q非常想知道Q请指教?br />再PSQ做了个测试,nginx+memcached,下蝲一?00多K的文Ӟ开100个线E,每个U程下蝲100ơ,全部命中跟全部不命中的情况几乎没有差别,q是Z么呢Q难道linuxpȝ本n已l有cached了吗Q?br />


冷锋 2011-11-20 22:35 发表评论
]]>有关TCP和UDP _包 消息保护边界(?http://www.shnenglu.com/ifeng/archive/2011/11/11/159950.html冷锋冷锋Fri, 11 Nov 2011 02:22:00 GMThttp://www.shnenglu.com/ifeng/archive/2011/11/11/159950.htmlhttp://www.shnenglu.com/ifeng/comments/159950.htmlhttp://www.shnenglu.com/ifeng/archive/2011/11/11/159950.html#Feedback0http://www.shnenglu.com/ifeng/comments/commentRss/159950.htmlhttp://www.shnenglu.com/ifeng/services/trackbacks/159950.html
在socket|络E序中,TCP和UDP分别是面向连接和非面向连接的。因此TCP的socket~程Q收发两端(客户端和服务器端Q都要有一一成对的socketQ因此,发送端Z多个发往接收端的包,更有效的发到ҎQ用了优化ҎQNagle法Q,多ơ间隔较且数据量小的数据,合ƈ成一个大的数据块Q然后进行封包。这P接收端,难于分辨出来了Q必L供科学的拆包机制?/div>
对于UDPQ不会用块的合q优化算法,q样Q实际上目前认ؓQ是׃UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区Q采用了铑ּl构来记录每一个到辄UDP包,在每个UDP包中有了消息头Q消息来源地址Q端口等信息Q,q样Q对于接收端来说Q就Ҏq行区分处理?/div>
保护消息边界和流
那么什么是保护消息边界和流?
保护消息边界Q就是指传输协议把数据当作一条独立的消息在网?nbsp;
传输,接收端只能接收独立的消息.也就是说存在保护消息边界,接收 
端一ơ只能接收发送端发出的一个数据包. 
而面向流则是指无保护消息保护边界?如果发送端q箋发送数? 
接收端有可能在一ơ接收动作中,会接收两个或者更多的数据?
我们举个例子来说,例如,我们q箋发送三个数据包,大小分别?k, 
4k , 8k,q三个数据包,都已l到达了接收端的|络堆栈?如果?nbsp;
用UDP协议,不管我们使用多大的接收缓冲区L收数?我们必须?nbsp;
三次接收动作,才能够把所有的数据包接收完.而用TCP协议,我们 
只要把接收的~冲区大设|在14k以上,我们p够一ơ把所有的 
数据包接收下?只需要有一ơ接收动?
q就是因为UDP协议的保护消息边界得每一个消息都是独立的.?nbsp;
传?却把数据当作一串数据流,他不认ؓ数据是一个一个的消息.
所以有很多人在使用tcp协议通讯的时?q不清楚tcp是基于流?nbsp;
传输,当连l发送数据的时?他们时常会认识tcp会丢?其实不然, 
因ؓ当他们用的~冲够大?他们有可能会一ơ接收到两个?nbsp;
x多的数据?而很多h往往会忽视这一?只解析检查了W一?nbsp;
数据?而已l接收的其他数据包却被忽略了.所以大家如果要作这 
cȝ|络~程的时?必须要注意这一?
l论Q?/div>
Ҏ以上所_可以q样理解QTCPZ保证可靠传输Q尽量减额?/div>
开销Q每ơ发包都要验证)Q因此采用了式传输Q面向流的传输,
相对于面向消息的传输Q可以减发送包的数量。从而减了额外开
销。但是,对于数据传输频繁的程序来Ԍ使用TCP可能会容易粘包?/div>
当然Q对接收端的E序来讲Q如果机器负荷很重,也会在接收缓冲里
_包。这P需要接收端额外拆包Q增加了工作量。因此,q个?/div>
别适合的是数据要求可靠传输Q但是不需要太频繁传输的场合(
两次操作间隔100msQ具体是由TCP{待发送间隔决定的Q取决于内核
中的socket的写法)
而UDPQ由于面向的是消息传输,它把所有接收到的消息都挂接到缓?/div>
区的接受队列中,因此Q它对于数据的提取分d更加方便Q但是,
它没有粘包机Ӟ因此Q当发送数据量较小的时候,׃发生数据?/div>
有效载荷较小的情况,也会增加多次发送的pȝ发送开销Q系l调用,
写硬件等Q和接收开销。因此,应该最好设|一个比较合适的数据?/div>
的包长,来进行UDP数据的发送。(UDP最大蝲荷ؓ1472Q因此最好能
每次传输接近q个数的数据量,q特别适合于视频,音频{大块数?/div>
的发送,同时Q通过减少握手来保证流媒体的实时性)


冷锋 2011-11-11 10:22 发表评论
]]>在英文字W串中找W一个最长不含重复字W的子串高效实现Q修改版Q?/title><link>http://www.shnenglu.com/ifeng/archive/2011/10/18/158631.html</link><dc:creator>冷锋</dc:creator><author>冷锋</author><pubDate>Tue, 18 Oct 2011 12:39:00 GMT</pubDate><guid>http://www.shnenglu.com/ifeng/archive/2011/10/18/158631.html</guid><wfw:comment>http://www.shnenglu.com/ifeng/comments/158631.html</wfw:comment><comments>http://www.shnenglu.com/ifeng/archive/2011/10/18/158631.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/ifeng/comments/commentRss/158631.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ifeng/services/trackbacks/158631.html</trackback:ping><description><![CDATA[扑ַ时候练习写的代码。翻出来了?br />今天有朋友指出来E序q行l果错误Q试了下Q果然有问题Q在下班途中重新整理了思\Q修改了代码Q整体思\不变Q就是加了几行代码,处理字符串的最后部分。求验证l果?br />Z问下Q怎么取消文章被评论时收到pȝ通知的邮件呢Q?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: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">GetSubStr( </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">str )<br />{<br />    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> hash[</span><span style="color: #000000; ">256</span><span style="color: #000000; ">]; </span><span style="color: #008000; ">//</span><span style="color: #008000; ">hash记录每个字符的出C|?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i;<br />    </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">( i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; "><</span><span style="color: #000000; ">256</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">++</span><span style="color: #000000; "> )<br />        hash[i]</span><span style="color: #000000; ">=-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> CurrentStart</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,MaxStart</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,MaxEnd</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,MaxLength </span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,CurrentLength </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">,strLen </span><span style="color: #000000; ">=</span><span style="color: #000000; "> strlen(str);<br />    </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; "><</span><span style="color: #000000; ">strLen;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />    {<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(CurrentStart</span><span style="color: #000000; ">></span><span style="color: #000000; ">hash[str[i]]) </span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果没有重复</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        {<br />            hash[str[i]]</span><span style="color: #000000; ">=</span><span style="color: #000000; ">i;<br />        }<br />        </span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />        {<br />            CurrentLength</span><span style="color: #000000; ">=</span><span style="color: #000000; ">i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">CurrentStart; </span><span style="color: #008000; ">//</span><span style="color: #008000; ">当前长度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(CurrentLength</span><span style="color: #000000; ">></span><span style="color: #000000; ">MaxEnd</span><span style="color: #000000; ">-</span><span style="color: #000000; ">MaxStart)</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果当前长度最?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            {<br />               MaxEnd</span><span style="color: #000000; ">=</span><span style="color: #000000; ">i; <br />               MaxStart</span><span style="color: #000000; ">=</span><span style="color: #000000; ">CurrentStart;<br />            }<br />            CurrentStart</span><span style="color: #000000; ">=</span><span style="color: #000000; ">hash[str[i]]</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">; </span><span style="color: #008000; ">//</span><span style="color: #008000; ">更新当前最长的L</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            hash[str[i]]</span><span style="color: #000000; ">=</span><span style="color: #000000; ">i; </span><span style="color: #008000; ">//</span><span style="color: #008000; ">更新字符出现的位|?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        }<br />    }<br />    </span><span style="color: #008000; ">//</span><span style="color: #008000; ">增加的代?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">( strLen </span><span style="color: #000000; ">-</span><span style="color: #000000; "> CurrentStart</span><span style="color: #000000; ">></span><span style="color: #000000; "> CurrentLength)<br />    {<br />        MaxEnd </span><span style="color: #000000; ">=</span><span style="color: #000000; "> strLen;<br />        MaxStart</span><span style="color: #000000; ">=</span><span style="color: #000000; ">CurrentStart;<br />    }<br />    </span><span style="color: #008000; ">//<br /></span><span style="color: #000000; ">    MaxLength</span><span style="color: #000000; ">=</span><span style="color: #000000; ">MaxEnd</span><span style="color: #000000; ">-</span><span style="color: #000000; ">MaxStart;<br />    </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">reStr </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">[MaxLength</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />    reStr[MaxLength]</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />    memcpy( reStr,str</span><span style="color: #000000; ">+</span><span style="color: #000000; ">MaxStart,MaxLength );<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> reStr;<br />}</span></div><br /><br /><br /><img src ="http://www.shnenglu.com/ifeng/aggbug/158631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ifeng/" target="_blank">冷锋</a> 2011-10-18 20:39 <a href="http://www.shnenglu.com/ifeng/archive/2011/10/18/158631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一致性hash法http://www.shnenglu.com/ifeng/archive/2011/10/18/158611.html冷锋冷锋Tue, 18 Oct 2011 05:49:00 GMThttp://www.shnenglu.com/ifeng/archive/2011/10/18/158611.htmlhttp://www.shnenglu.com/ifeng/comments/158611.htmlhttp://www.shnenglu.com/ifeng/archive/2011/10/18/158611.html#Feedback0http://www.shnenglu.com/ifeng/comments/commentRss/158611.htmlhttp://www.shnenglu.com/ifeng/services/trackbacks/158611.htmlhttp://hbluojiahui.blog.163.com/blog/static/31064767201098114026211/

冷锋 2011-10-18 13:49 发表评论
]]>
mysql字符串{义函?/title><link>http://www.shnenglu.com/ifeng/archive/2011/10/17/158523.html</link><dc:creator>冷锋</dc:creator><author>冷锋</author><pubDate>Mon, 17 Oct 2011 03:43:00 GMT</pubDate><guid>http://www.shnenglu.com/ifeng/archive/2011/10/17/158523.html</guid><wfw:comment>http://www.shnenglu.com/ifeng/comments/158523.html</wfw:comment><comments>http://www.shnenglu.com/ifeng/archive/2011/10/17/158523.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/ifeng/comments/commentRss/158523.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ifeng/services/trackbacks/158523.html</trackback:ping><description><![CDATA[<div><div>在mysql插入数据表,如果数据中带?\“会造成语法错误Q这个不用解释,你懂的,因此需要写个{义函敎ͼ一开始想直接用string的replaceQ但是这个方法要调用3?/div><div>攑֜服务端感觉效率太低了Q于是用C写了个,感觉q可以,旉复杂度跟需要{义字W的个数无关Q如果源串没有匹配的话不需要copy操作.<br /><span id="08isoqs" class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; "><span style="color: #008000; ">//</span><span style="color: #008000; ">转义函数,‘转成\'</span></span></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"><span style="color: #0000FF; ">bool</span><span style="color: #000000; "> ConverToDBStr( </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; "> src,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dst )<br />{<br />    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">记录上次匚w的位|?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> dOffset </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">目标字符串游?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> nCopy </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">本次需要成 copy的字节数</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p </span><span style="color: #000000; ">=</span><span style="color: #000000; "> src;<br />    </span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">( </span><span style="color: #000000; ">*</span><span style="color: #000000; ">p )<br />    {<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">( </span><span style="color: #000000; ">*</span><span style="color: #000000; ">p</span><span style="color: #000000; ">==</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\\</span><span style="color: #000000; ">'</span><span style="color: #000000; ">||*</span><span style="color: #000000; ">p</span><span style="color: #000000; ">==</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\</span><span style="color: #000000; ">''</span><span style="color: #000000; ">||*p==</span><span style="color: #000000; ">'"</span><span style="color: #000000; ">' )</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">        {<br />            nCopy </span><span style="color: #000000; ">=</span><span style="color: #000000; "> p</span><span style="color: #000000; ">-</span><span style="color: #000000; ">src</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />            memcpy( dst</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dOffset,src</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,nCopy );<br />            dOffset</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">nCopy;<br />            </span><span style="color: #000000; ">*</span><span style="color: #000000; ">(dst</span><span style="color: #000000; ">+</span><span style="color: #000000; ">Offset)</span><span style="color: #000000; ">=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\\</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />            </span><span style="color: #000000; ">*</span><span style="color: #000000; ">(dst</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dOffset</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">=*</span><span style="color: #000000; ">p;<br />            dOffset</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />            i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> p</span><span style="color: #000000; ">-</span><span style="color: #000000; ">src;<br />        }<br />        p</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />    }<br />    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">( dOffset</span><span style="color: #000000; ">></span><span style="color: #000000; ">0</span><span style="color: #000000; "> )</span><span style="color: #008000; ">//</span><span style="color: #008000; ">有匹配到Qcopy最后的字符?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    {<br />        memcpy( dst</span><span style="color: #000000; ">+</span><span style="color: #000000; ">dOffset,src</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,p</span><span style="color: #000000; ">-</span><span style="color: #000000; ">src</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i );<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />    }<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span></div><div><span id="60wk0wi" class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; ">}<br />可以看到Q这个函数稍微改动下可以实现replace</span></div></div><img src ="http://www.shnenglu.com/ifeng/aggbug/158523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ifeng/" target="_blank">冷锋</a> 2011-10-17 11:43 <a href="http://www.shnenglu.com/ifeng/archive/2011/10/17/158523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.hotdee.com.cn" target="_blank">պþþþĻ</a>| <a href="http://www.qysf88.cn" target="_blank">޾þþþþAV</a>| <a href="http://www.0838auto.cn" target="_blank">ղþǿѵĿ</a>| <a href="http://www.icalip2008.cn" target="_blank">պ޹ۺϾþþ</a>| <a href="http://www.950aw.cn" target="_blank">˾þô߽ </a>| <a href="http://www.lglmhdf.cn" target="_blank">þþþþþ</a>| <a href="http://www.a3314.cn" target="_blank">ҹAVëƬþ</a>| <a href="http://www.lenovophone.com.cn" target="_blank">Ʒ99þþþþ鶹</a>| <a href="http://www.xoci.cn" target="_blank">þ99һ</a>| <a href="http://www.88ye.cn" target="_blank">޹þþþþþ</a>| <a href="http://www.52chaoyang.cn" target="_blank">޾Ʒһþþ </a>| <a href="http://www.hongyuan123.cn" target="_blank">þþƷ91þۺ鶹</a>| <a href="http://www.piaozen.cn" target="_blank">99þùѸ</a>| <a href="http://www.tjppfdm.cn" target="_blank">޾þһ</a>| <a href="http://www.114out.cn" target="_blank">99þѹƷ</a>| <a href="http://www.taiguolu.com.cn" target="_blank">þ޾ƷĻ</a>| <a href="http://www.2nder.cn" target="_blank">ٸƷþ</a>| <a href="http://www.3743.com.cn" target="_blank">ŷ龫Ʒþþþ</a>| <a href="http://www.0x5e.cn" target="_blank">ƷþĻ</a>| <a href="http://www.pbti.com.cn" target="_blank">þþþþþ91Ʒѹۿ</a>| <a href="http://www.smtch.cn" target="_blank">һɫþ88ձȡۺ</a>| <a href="http://www.steelcom.cn" target="_blank">þùAV䡪ٶ</a>| <a href="http://www.fcaiwanzhen.cn" target="_blank">þþƷһ</a>| <a href="http://www.kxblogs.cn" target="_blank">ݺݺɫۺϾþ </a>| <a href="http://www.aboto.cn" target="_blank">͵þþþƷר</a>| <a href="http://www.unnk.cn" target="_blank">þþþƷ޳18վ</a>| <a href="http://www.zkduo.cn" target="_blank">ڵСþþþþþ</a>| <a href="http://www.wlvq.cn" target="_blank">þþþþþۺϺݺۺ</a>| <a href="http://www.palmback.cn" target="_blank">þþƷƷƾ</a>| <a href="http://www.syiz.cn" target="_blank">ŷþþƷһcƬƬ</a>| <a href="http://www.zzbxgsx.cn" target="_blank">ƷþþӰ</a>| <a href="http://www.www008tt.cn" target="_blank">ҹþþӰԺ</a>| <a href="http://www.fc27.cn" target="_blank">һAëƬѹۿþþƷ</a>| <a href="http://www.blog060422.cn" target="_blank">ھƷþþþav</a>| <a href="http://www.effusion.net.cn" target="_blank">ŷ츾XXXXԾþþ </a>| <a href="http://www.6654sf.cn" target="_blank">þþ뾫ƷպĦ</a>| <a href="http://www.5billion.com.cn" target="_blank">ٸþĻ </a>| <a href="http://www.hbxstech.cn" target="_blank">ٸ88þĻ</a>| <a href="http://www.nanling888.cn" target="_blank">Ѿþˬˬav</a>| <a href="http://www.mt4.net.cn" target="_blank">Ʒ׾þAAAƬ69 </a>| <a href="http://www.xp5hb9.cn" target="_blank">þrоƷƵ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>