HAProxy几个重要的结构体的使用

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
& HAProxy是一个单进程事件驱动的模型。 & 首先看一个比较重要的结构体:
struct&poller&{ &&&&void&&&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&any&private&data&for&the&poller&*/ &&&&int&&REGPRM2&(*is_set)(const&int&fd,&int&dir);&&&&&&&/*&check&if&&fd&&is&being&polled&for&dir&&dir&&*/ &&&&int&&REGPRM2&&&&(*set)(const&int&fd,&int&dir);&&&&&&&/*&set&&&polling&on&&fd&&for&&dir&&*/ &&&&int&&REGPRM2&&&&(*clr)(const&int&fd,&int&dir);&&&&&&&/*&clear&polling&on&&fd&&for&&dir&&*/ &&&&int&&REGPRM2&(*cond_s)(const&int&fd,&int&dir);&&&&&&&/*&set&&&polling&on&&fd&&for&&dir&&if&unset&*/ &&&&int&&REGPRM2&(*cond_c)(const&int&fd,&int&dir);&&&&&&&/*&clear&polling&on&&fd&&for&&dir&&if&set&*/ &&&&void&REGPRM1&&&&(*rem)(const&int&fd);&&&&&&&&&&&&&&&&/*&remove&any&polling&on&&fd&&*/ &&&&void&REGPRM1&&&&(*clo)(const&int&fd);&&&&&&&&&&&&&&&&/*&mark&&fd&&as&closed&*/ &&&&&&&&void&REGPRM2&&&(*poll)(struct&poller&*p,&int&exp);&&&/*&the&poller&itself&*/ &&&&int&&REGPRM1&&&(*init)(struct&poller&*p);&&&&&&&&&&&&/*&poller&initialization&*/ &&&&void&REGPRM1&&&(*term)(struct&poller&*p);&&&&&&&&&&&&/*&termination&of&this&poller&*/ &&&&int&&REGPRM1&&&(*test)(struct&poller&*p);&&&&&&&&&&&&/*&pre-init&check&of&the&poller&*/ &&&&int&&REGPRM1&&&(*fork)(struct&poller&*p);&&&&&&&&&&&&/*&post-fork&re-opening&*/ &&&&const&char&&&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&poller&name&*/ &&&&int&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&try&pollers&with&higher&preference&first&*/ };&& & 该结构体是事件循环的核心,各个字段都有比较详细的注释,就不解释了,注意一下函数指针前面的&REGPRM2和REGPRM1,这两个宏指示编译器,在函数调用时,参数传递采用寄存器传递。 & &为了使用不同的事件监听函数select/poll等,haproxy 和
libevent等一样,采用结构体+函数指针的方式来实现,在libevent是将结构体数组定义为全局变量,然后进行显示的赋值,在Haproxy中同样定义了全局的结构体数组,但是却没有找到在那里进行初始化,最后在看ev_epoll.c的代码的时候,看到了以下这个函数: &
__attribute__((constructor)) static&void&_do_register(void) { struct&poller&*p; & if&(nbpollers&&=&MAX_POLLERS)
& epoll_fd&=&-1; p&=&&pollers[nbpollers++]; & p-&name&=&"epoll"; p-&pref&=&300; p-&private&=&NULL; & p-&test&=&_do_ p-&init&=&_do_ p-&term&=&_do_ p-&poll&=&_do_ p-&fork&=&_do_ & p-&is_set&&=&__fd_is_ p-&cond_s&=&p-&set&=&__fd_ p-&cond_c&=&p-&clr&=&__fd_ p-&rem&=&__fd_ p-&clo&=&__fd_ } & 该函数很明显就是给结构体中的函数指针赋值,但是却没有地方调用这个函数,原来被__attribute__((constructor))修饰的函数是在main函数之前自动调用的,见我的前一篇博客。 & 使用readelf
查看可执行文件,发现在我的系统上,haproxy调用了4个_do_register,分别是select/poll/epoll/sepoll,这几个pref值分别是100/200/300/400,可以看到sepoll的优先级是最高的。 sepoll在底层还是采用的epoll的系统调用如epoll_wait等,只是在外面加了一下优化,这个以后有机会再分析。 & haproxy的主循环是 run_poll_loop();
& 展开该函数:
&&void&run_poll_loop()&&&&& &&{& &&&&&&int&&&&&&&&&&&&& &&&& &&&&&&tv_update_date(0,1);& &&&&&&while&(1)&{&&&&&&&&&& &&&&&&&&&&/*&check&if&we&caught&some&signals&and&process&them&*/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&signal_process_queue();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&& &&&&&&&&&&/*&Check&if&we&can&expire&some&tasks&*/ &&&&&&&&&&wake_expired_tasks(&next);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&& &&&&&&&&&&/*&Process&a&few&tasks&*/&&&&&& &&&&&&&&&&process_runnable_tasks(&next);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&& &&&&&&&&&&/*&maintain&all&proxies&in&a&consistent&state.&This&should&quickly &&&&&&&&&&&*&become&a&task&because&it&becomes&expensive&when&there&are&huge&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&*&numbers&of&proxies.&*/&&&&&& &&&&&&&&&&maintain_proxies(&next);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&& &&&&&&&&&&/*&stop&when&there's&no&connection&left&and&we&don't&allow&them&anymore&*/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&if&(!actconn&&&&listeners&==&0)&&&& &&&&&&&&&&&&&&&&&&&&& &&&& &&&&&&&&&&/*&The&poller&will&ensure&it&returns&around&&next&&*/ &&&&&&&&&&cur_poller.poll(&cur_poller,&next);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&} &&}&& & cur_poller 是个全局变量,指向正在使用的poller结构。该函数中主要分析 process_runnable_tasks 函数。 & process_runable_tasks主要是从运行队列中取出task,调用其process函数,process函数返回之后将task放入等待队列。 为了保证所有task都及时响应,每次调用运行队列取出的task最大为运行队列的1/4,同时个数不超过200个。 & task结构体如下: /* The base for all tasks */struct task {&struct eb32_&&/*
ebtree node used to hold the task in the wait queue */&struct eb32_&&/* ebtree node used to hold the task in the run queue */&&&&/* task state : bit field of TASK_* */&&&&/* next
expiration date for this task, in ticks */&&&/* number of
times -&process() was called */&struct task * (*process)(struct task
*t);& /* the function which processes the task */&void *&&&/* the
task's context */&&&&/* the task's current nice value from -1024 to
+1024 */}; & process为函数指针,大部分情况下都是使用process_session对其赋值。上面介绍了HAProxy的主循环&run_poll_loop(),在该函数的最后是调用
cur_poller.poll(&cur_poller,&next);&,其中cur_poller是指当前被使用的poller结构,本篇以linux的epoll为例来看一下poller的工作方式。 & 首先看其初始化函数:
__attribute__((constructor)) static&void&_do_register(void) { struct&poller&*p; & &&&&if&(nbpollers&&=&MAX_POLLERS) &&&&&&&& & &&&&epoll_fd&=&-1; p&=&&pollers[nbpollers++]; & p-&name&=&"epoll"; &&&&p-&pref&=&300; p-&private&=&NULL; & p-&test&=&_do_ &&&&p-&init&=&_do_ &&&&p-&term&=&_do_ p-&poll&=&_do_ &&&&p-&fork&=&_do_ & &&&&p-&is_set&&=&__fd_is_ p-&cond_s&=&p-&set&=&__fd_ p-&cond_c&=&p-&clr&=&__fd_ p-&rem&=&__fd_ &&&&p-&clo&=&__fd_ } & 其中poll 初始化为
_do_poll,在_do_poll中主做了两件事情:1、调用epoll_wait等待事件;2、调用相应fd的接收/发送函数。 调用epoll_wait之前需要计算出最大允许事件个数,这里稍微有点奇怪的是,并没有检查epoll_wait的返回码,即当epoll_wait返回-1时没有做处理,当然如果是因为信号中断而返回-1,run_poll_loop里面还是有处理的,但是其他错误,好像没有处理。 & 调用fd的接收/发送函数也是通过函数指针调用的,类似于下面的情形: fdtab[fd].cb[DIR_RD].f(fd); & fdtab是一个结构体名称,也是一个全局变量名称,全局变量在main函数中进行初始化,fdtab结构体定义如下:
struct&fdtab&{ &&& struct&{ &int&(*f)(int&fd);&&&&&&&&&&&&/*&read/write&function&*/ &&&&&&&&struct&buffer&*b;&&&&&&&&&&&&/*&read/write&buffer&*/ &&&&}&cb[DIR_SIZE]; &&&&void&*&&&&&&&&&&&&&&&&&&&&&&&&&/*&the&session&(or&proxy)&associated&with&this&fd&*/ &&&
struct&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&used&by&pollers&which&support&speculative&polling&*/ &&&&&&&&unsigned&char&e;&&&&&&&&&&&&&/*&read&and&write&events&status.&4&bits,&may&be&merged&into&flags'&lower&bits&*/ &&&&&&&&unsigned&int&s1;&&&&&&&&&&&&&/*&Position&in&spec&list+1.&0=not&in&list.&*/ &&&&}& &&&&unsigned&short&&&&&&&&&&&&&&&&&/*&various&flags&precising&the&exact&status&of&this&fd&*/ &&&&unsigned&char&&&&&&&&&&&&&&&&&&/*&the&state&of&this&fd&*/ &&&&unsigned&char&&&&&&&&&&&&&&&&&&&&&/*&event&seen&in&return&of&poll()&:&FD_POLL_*&*/ }; & 其中cb 有接收/发送的函数和缓冲区初始化,owner 在处理客户端连接时初始化为task,处理listen时初始化为listener。 & fdtab初始化主要是进行了空间的分配,以及state的初始化,代码如下: &&&& fdtab = (struct fdtab *)calloc(1,&&&&&&&&&&&&&&&&&&&&&&&
sizeof(struct fdtab) * (global.maxsock));
&&&&&for&(i&=&0;&i&&&global.&i++)&{ &&&&&&&&&fdtab[i].state&=&FD_STCLOSE; &&&&&} & 接下来查看cb 以及owner在哪里初始化,在client.c里面: int event_accept(int fd) { struct listener *l = fdtab[fd]. ....... struct task *t; ...... & t&=&task_new()
....... & s-&si[0].owner = & fdtab[cfd].owner&=&&s-&si[0];&& //owner
初始化为 task &
fdtab[cfd].cb[DIR_RD].f&=&l-&proto-& fdtab[cfd].cb[DIR_RD].b&=&s-& fdtab[cfd].cb[DIR_WR].f&=&l-&proto-& fdtab[cfd].cb[DIR_WR].b&=&s-& ...... } & 可见,初始化cb的是lintener里面的proto结构体。而该结构体是在哪里初始化呢? & 在proto_tcp.c 中有如下代码: void tcpv4_add_listener(struct listener
*listener)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&&
&&&& if (listener-&state != LI_INIT)&&&&&&&&&&&&
listener-&state =
LI_ASSIGNED;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&& listener-&proto =
&proto_tcpv4;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&& LIST_ADDQ(&proto_tcpv4.listeners,
&listener-&proto_list);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
proto_tcpv4.nb_listeners++;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
} & 再看proto_tcpv4是一个static变量,在proto_tcp.c的开头初始化。
static&struct&protocol&proto_tcpv4&=&{ &&&&.name&=&"tcpv4",&&&&& &&&&.sock_domain&=&AF_INET, &&&&.sock_type&=&SOCK_STREAM, &&&&.sock_prot&=&IPPROTO_TCP, &&&&.sock_family&=&AF_INET, &&&&.sock_addrlen&=&sizeof(struct&sockaddr_in), &&&&.l3_addrlen&=&32/8,&& &&&&.read&=&&stream_sock_read, &&&&.write&=&&stream_sock_write,&&& &&&&.bind_all&=&tcp_bind_listeners, &&&&.unbind_all&=&unbind_all_listeners, &&&&.enable_all&=&enable_all_listeners, &&&&.listeners&=&LIST_HEAD_INIT(proto_tcpv4.listeners),&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&.nb_listeners&=&0, }; & 而tcpv4_add_listener的调用是在读取配置文件的时候,在cfgparse.c 中: & static int str2listener(char *str, struct proxy *curproxy) { ...... tcpv4_add_listener(l); ...... } & 到此为止,已经清楚了socket接收和发送的函数就是stream_sock_read 和 stream_sock_write。 & 继续往下看,stream_sock_read 和 stream_sock_write 在stream_sock.c
中,stream_sock_read 的代码比较长,其实干的事情比较简单明确: 1、计算接收缓冲区的剩余空间; 2、调用recv进行接收; 3、将fd相关的task放入run queue; & 放入run queue的task在接下来的&run_poll_loop()里面被处理。到此一次poll完成。
阅读(2099)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'HAProxy 代码阅读(一)',
blogAbstract:'HAproxy是一个简单强大的http/tcp负载均衡工具,其代码量只有5w多行,以下是一些阅读代码的过程的记录,方便以后查看。 & HAProxy是一个单进程事件驱动的模型。 & 首先看一个比较重要的结构体:
struct&poller&{ &&&&void&&&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&any&private&data&for&the&poller&*/ &&&&int&&REGPRM2&(*is_set)(const&int&fd,&int&dir);&&',
blogTag:'haproxy',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:9,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}扫一扫体验手机阅读
多维数组,结构体与二级指针
<span type="1" blog_id="1790842" userid='
分享到朋友圈
关注作者,不错过每一篇精彩&&&&&&&&&&&&新手入门:C C++中的结构体
正在努力加载播放器,请稍等…
正在努力加载播放器
所需财富值:
0文件大小:6.90KB
您当前剩余财富值:&&
大小:6.90KB&&所需金币:50
&& & 金币不足怎么办?
下载量:-次 浏览量:201次
贡献时间: 14:50:31
文档标签:
已有-位用户参与评分
下载过这篇文档的还下载过
同类热门文档
你可能喜欢
看过这篇文档的还看过
阅读:283&&下载:11
阅读:194&&下载:2
阅读:1657&&下载:1
阅读:121&&下载:0
阅读:75&&下载:0
阅读:126&&下载:0
阅读:80&&下载:0
阅读:83&&下载:0
阅读:79&&下载:0
阅读:68&&下载:0
该用户的其他文档
所需财富值:
50文件大小:6.90KB
您当前剩余财富值:&&
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
举报该文档侵犯版权。
例: http://wenku.it168.com/help.shtml今天,读者fuyou分享了一个十分有趣的现象,谷歌网页搜索计算器Onebox认为,&不可思议&这个词=1×10的64次方.这个很普通的词,被谷歌诠释了特别的含义?但是,经过我的查询发现,这个词在日本江户时代的数学家吉田光,在著作中就出现比秭(=1×10^24)更大的数量单位就是穰.沟.涧.正.载.极.垣河沙.阿僧?.那由他.不可思议.无量.大数! 一=1×10^0 十=1×10^1 百=1×10^2 千=1×10^3 万=1×10^4 亿=1×10^8 兆=1×10^12 京=1×10
Concerned about the content: pstmt.setTimestamp (1, rs.getTimestamp (1)); / / COLLECTTIME DATE package datatransfer. import datatransfer.DB_ConnectM import datatransfer.M import java.sql .*; import java.sql.PreparedS import ja
110.81.18.141 = .217.183 = 8909 This is my one day test agent ip, speed is quite slow, these are available to everyone hope you can help 222.125.87.207 = .71.215 = .41.144 = .238.28 = 8909 host-120.155-43-
混元攻击装--上衣 装备名称 品质 来源 百花锦袍 拾取后绑定 上衣 外功防御提高655 体质+40 根骨+34 元气+30 混元性内功攻击提高50 混元性内功破防值提高4 御劲值提高125 万花谷琴圣苏雨鸾采集百花加以云锦造成此袍赠予花圣花宇晴. 需要等级70 耐久度:259/259 品质等?:80 需要声望:未知势力 亲密 百花锦袍 80品 浩气盟声望亲密 琼霄醉仙袍 拾取后绑定 上衣 外功防御提高792 体质+32 根骨+92 元气+34 混元性内功会心值提高173 混元性内功攻击提高48
修改,增加 MySQL的空间扩展(MySQL Spatial Extensions)的解决方案: MySQL的空间扩展(MySQL Spatial Extensions),它允许在MySQL中直接处理.保存和分析地理位置相关的信息,看起来这是使用MySQL处理地理位置信息的&官方解决方案&. 但恰恰很可惜的是:它却不支持某些最基本的地理位置操作,比如查询在半径范围内的所有数据.它甚至连两坐标点之间的距离计算方法都没有(MySQL Spatial的distance方
We discussed in chapter III and IV models are based on the compression of information in the statistical frequency of a single character designed until the late 70s, this idea has been in the field of data compression dominates. Today in our view, th
] [Switched http://www.cnblogs.com/KevinYang/archive//1760597.html Character encoding of the problem seems small, often overlooked by technical staff, but can easily lead to some strange problems. I came up with a bit universal character en
When the program was doing some coding problems will inevitably arise, if there is some understanding of the character code, that would be handy to solve some of the time Speaking from the ASCII code Speaking of character encoding, have to say a brie
Use the following date and time functions: -TZ_OFFSET -CURRENT_DATE -CURRENT_TIMESTAMP -LOCALTIMESTAMP -DBTIMEZONE -SESSIONTIMEZONE -EXTRACT -FROM_TZ -TO_TIMESTAMP -TO_TIMESTAMP_TZ -TO_YMINTERVAL oracle9i date and time support :: In Oracle9i, you can
Nanshan District, very few public basketball courts, you can find the nearest school (preferably primary), community centers or industrial areas and sports activities (residential property), which generally has a basketball court, but the majority is
In order to query a tree structure table, in Oracle's PL / SQL provides a compelling music features - CONNECT BY clause. It greatly facilitates our table to find the tree: a tree traversal to find a branch ..., but still there are some deficiencies.
[ 概述 ] 在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 2. 为了保证Web服务器不会因为当个页面处理性能差而导致无法访问其他页面,则会对某些页面操作设置 3. 对于某些上传或者不确定处理时间的场合,则需要对整个流程中所有超时设置为无限,否则任何一个环节设置不当,都会导致莫名执行中断 4. 多个后端模块(MySQL.Memcached.HTTP接口),为了防止单个接口性能太差,导致整个前面获取数
在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景,方便需要的朋友 在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 2. 为了保证Web服务器不会因为当个页面处理性能差而导致无法访问其他页面,则会对某些页面操作设置 3. 对于某些上传或者不确定处理时间的场合,则需要对整个流程中所有超时设置为无限,否则任何一个环节设置不当,都会导致莫名执行中断 4. 多个后端模块(MySQL.Memca
外防攻击装--上衣 装备名称 品质 来源 南锋铠 拾取后绑定 上衣 外功防御提高655 体质+54 根骨+15 力道+30 外功攻击提高29 外功破防值提高83 外功防御额外提高212 御劲值提高122 天策府天枪营藏器之一. 需要等级70 耐久度:259/259 品质等?:80 需要声望:未知势力 亲密 南锋铠 80品 浩气盟声望亲密 闻道袍 拾取后绑定 上衣 外功防御提高655 体质+43 根骨+34 力道+22 身法+14 外功攻击提高24 外功破防值提高93 御劲值提高122 朝闻道,夕
网站受到DDOS的攻击,Inbound最高请求58.85Mb/sec .尽管一开始解决问题的思路是错误的,但是在这个过程中,我们思考问题的思路对团队的成长有所帮助,我们知道什么方法无法解决问题.解决问题的过程分为3个阶段: 1:nginx端屏蔽访问 修改nginx配置文件,添加如下记录 location ~ //you_url{ return 404; } 问题:发现请求堵塞在haproxy上面去了 2:修改haproxy的配置 acl invalid_req url_sub -i c=220
直接上战斗力列表: 只能说8800是神一样的存在 High End Videocards - Updated 27th of December 2010 Videocard PassMark G3D Score GeForce GTX 580 3,781 GeForce GTX 480 3,530 GeForce GTX 570 3,369 Quadro
GeForce GTX 470 2,963 Radeon HD 6970 2,
JS radio button to obtain the value of &label& &input type=&radio& name=&radio& value=&1-10 Years old && 1-10 years old &/ label& &label& &input type=&radio& name=&radio& value=&
&cript type=&text/javacript&& function changeFile(){ var Outid=document.getElementById('imgout'); Outid.src=document.getElementById('title_picture'). var Nimg=new Image(); Nimg.src =document.getElementById('title_picture'). Out
In the previous project, we are talking about the efficiency of binary search tree when. Different structures of binary search tree, look for efficiency are quite different (single-branch tree structure became the order of search to find the efficien
This year the kernel slab, timer with a very in-depth understanding of, and under all windows have the opportunity to rewrite again. Forgot your article made a slab, as if the network already has a very full version, and would like to say that under
Previous articles are some of the rectangle inside a painting, today to see how the android phone number on the screen to draw geometric shapes, such as triangles, polygons, ellipses, circles, squares and so on. And set of hollow, solid. Let us first
Gray Code (Gray code) is a collection of series, each number used to represent binary, assuming the number of n bits to represent each well, either between two numbers is only one bit value is different, such as the following 3 bit Gray Code: 000 001
Code base One. What is the verification code and its role : Code for the automatic distinction between computer and human Turing test stands, is a distinction between a computer user's public automatic process, this problem can be generated by a comp
, Slice: silce, []-----------------[] is silce alias, so the two are exactly the same operation 1: to determine whether the string contains the string / sub-mode string [substring] string [/ pattern /] string [/ pattern /, position] # position after
linux remote access control (hosts.allow and hosts.deny) / Etc / hosts.allow and / etc / hosts.deny file is the control of two remote access settings, and through him can allow or deny an ip or ip linux client access section of a service. Such as the
Multi-table join Connection with a query data from multiple tables SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2; :: Write in the WHERE clause conditions connecting :: When more than one table in the sa
Environment is RHEL4.3, many packages are readily available RPM, so the installation process omitted. To ensure that saslauthd, sendmail, cyrus-imapd, cyrus-imapd-utils, m4 are successfully installed. To saslauthd, sendmail, cyrus-imapd are set to st
redhat as4 common application of the hosts.allow and hosts.deny First, an overview These two documents are tcpd server configuration files, tcpd server can control the external IP of the local service access. The format of these configuration files a
Txt file to know today, there is also a character encoding. Under normal circumstances, txt files are ansi character encoding, of course, can be replaced with utf8. mysql-load data a bug, that under certain circumstances occur. mysql database propert
javascript在通过parseIn或parseFloat将字符串转化为数字的过程中,如果字符串中包含有非数字,那么将会返回NaN,参考下面代码 parseInt(&Hello&,10);//return NAN parseInt(&110&,10);//return 110 所以简单的判断字符串是否为数字的方法就是利用isNaN(),如果返回true,则该字符串不为数字,否则为数字 复制代码 代码如下: isNaN(parseInt(&Hello&q
这篇文章主要介绍了php解析json数据实例,很重要的一个应用,需要的朋友可以参考下 本文以实例形式展示了php解析json数据的方法,这是一个比较实用的功能,分享给大家供大家参考.具体代码如下: &?php $ $data.= &[&; for ($i = 0; $i & 20; $i++) { $data.= &{&; $data.= &\&id\&:\&& . 110 . &\&
这篇文章主要介绍了oracle如果查询取4至10行并排序,很简单,很实用,正在学习oracle的朋友可以参考下 不能直接用rownum,要查询出来以后用别名转换. 以EMP表为范例,取4至10行: select * from (select rownum id,t.* from emp t) where id between 4 and 10; 有需要排序的,一定要这样处理: select * from ( select rownum rn,t.* from ( select a.* from
&script language=&JavaScript&& &!-- var flag= function DrawImage(ImgD){ var image=new Image(); image.src=ImgD. if(image.width&0 && image.height&0){ flag= if(image.width/image.height&= 180/110){ if(image.w
这篇文章主要介绍了oracle通过行范围查询取4至10行,以EMP表为范例,需要的朋友可以参考下 不能直接用rownum,要查询出来以后用别名转换. 以EMP表为范例,取4至10行: select * from (select rownum id,t.* from emp t) where id between 4 and 10; 有需要排序的,一定要这样处理: select * from ( select rownum rn,t.* from ( select a.* from eba02 a
这篇文章主要介绍了C# 实现的图片盖章功能,支持拖拽.旋转.放缩.保存,需要的朋友可以参考下 实现图片盖章功能,在图片上点击,增加&图章&小图片,可以拖拽&图章&到任意位置,也可以点击图章右下角园框,令图片跟着鼠标旋转和放缩. 操作方法:1.点击增加&图章&2.选中移动图标3.点中右下角放缩旋转图章. 效果图: 实现代码如下: 1. 窗口Xaml代码 &Window x:Class=&Lenovo.YogaPaster.Image
本篇文章主要是对c++异常处理机制示例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 这两天我写了一个测试c++异常处理机制的例子,感觉有很好的示范作用,在此贴出来,给c++异常处理的初学者入门.本文后附有c++异常的知识普及,有兴趣者也可以看看. 下面的代码直接贴到你的console工程中,可以运行调试看看效果,并分析c++的异常机制. #include &stdafx.h& #include&stdlib.h& #include&crtdbg.h&
教你如何解密js/vbs/vbscript加密的编码异处理加密代码 是一篇非常不错的加密解密原理,希望大家仔细研究 js/vbs/vbscript加密代码: &body style=&font:12px&& &fieldset& &legend align=&center&&源码变异处理 &/legend& &table& &tr valign=top& &td&&br&
JS代码(随便放哪里): &script language=&JavaScript&& &!-- var flag= function DrawImage(ImgD){ var image=new Image(); image.src=http://www.jb51.net/htmldata//ImgD. if(image.width&0 && image.height&0){ flag=
系列文章目录索引:&&裸泳者&调查:PE/VC狂欢的终结?& 案例之二:ITAT是怎样速成的 本报记者 郝凤苓 上海报道 在香港联交所首度聆讯7个月之后仍未上市的ITAT,此后一直处于被举报财务造假.中止与投行的合作.上市搁浅的传闻之中. 日,是服装连锁企业ITAT在港交所进行首次上市聆讯的日子. 2月23日,本报一篇名为&ITAT进入静默期:奇迹还是骗局&的文章首次在业界对ITAT模式.财务数据和发展前景等进行大胆质疑,令市场哗然. 从此,I
曾受黑客攻击的&爱心天空公益网站&截图 南方周末特约撰稿 黄利,实习生 赵一海 全国十余家大型同性恋网站遭到黑客攻击,数百万网友资料被窃取.黑客攻击的背后企图是什么?南方周末的调查发现,这些黑客背后有着错综复杂的利益链,攻击起处在法律灰色地带的同性恋网站,不但屡屡得手,而且鲜有受罚-- &那一个月我被折腾惨了.&想起半年前网站遭黑客攻击,一个月更换20次服务器的经历,&辽宁同志&网的负责人大刚仍然心有余悸. 去年8月到10月,黑龙江.辽宁.北京.
今天正好一群人想把军团长英德拉图的任务做掉,于是3队人马组成团杀到FB门口 到地城门口之前没什么特别的,快到之前的桥上有个48满星怪,不用打他,边上直接有个小桥可以通过. 值得一提的是,洞穴里神石和匠人特级暴率极高,一路扫过去居然扫出2块神石. 当然,我没有ROLL到. 说重点,地城里都是47以上精英怪,队伍组成1守护1魔道1治疗1剑是必须的,为什么我之后会说,有条件的话多带一个护法或者治疗,一个治疗非常的危险,之后我也会说明. 这个地城其实就是一个要塞,清完门口的兵,打掉城门,一路杀下去就是了
本文介绍Flash中SpriteSheet精灵序列图与其它渲染方式的性能对比.SpriteSheet的原理及注意实现,最后实现了一个精灵序列图的渲染引擎.本文的SpriteSheet引擎及demo可以在github上下载:https://github.com/saylorzhu/SpriteSheet 动画渲染性能对比 Flash中动画制作方式有多种,如矢量动画.位图帧动画.精灵序列图等等.针对不同的制作方式,对同一个角色动画进行如下测试:一个角色在屏幕上显示5个实例,对应呼吸.施法.行走.受伤
作者: 晋哥哥 发表于
02:28 原文链接 阅读: 1401 评论: 23 好吧,我不得不违背初衷,因为我觉得作为技术人员的博客,还是应当有一些生活气息,才能从木讷中透露出几分可爱. 作为参加工作后的新家,选在cnblogs还是有些原因的.首先,这里比较活跃,其次,主攻Java的我,还是希望能写出一些.net社区的筒子们也能读得懂的文章,这样才能避免我太过纠缠技术细节,从而将焦点向上转移.我不想再像写百度博客时那样高产而无质量而言了. 好吧好吧,我马上切入正题. 我是个蛮
--============================================= --SQL基础--& 序列(SEQUENCE).同义词(SYNONYM) --============================================= 一.序列 是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常用于产生主键值 类似于SQL server中的IDENTITY(int,1,1) 或者列为IDENTITY列.SQL server可以直接将列指定
滑雪滑的蛋粉,,,, #include &iostream& #include &string& int m, n, max, int a[120][120]; int dp[120][120]; int face[4][2]={{0,1},{0,-1},{-1,0},{1,0}}; void DFS(int x, int y){ /*for(int i=0; i&4; i++){ //四個方向擴展 if(x+face[i
貌似很简单,可惜我写出来还没有提交就结束比赛了 题目列表 & 石头剪刀布 时间限制: 1000ms 内存限制: 1024MB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B正好在玩石头剪刀布.已知他们的出拳都是有规律的,比如:&石头-布-石头-剪刀-石头-布-石头-剪刀--&,就是以&石头-布-石头-剪刀&为周期的.请问,小A和小B比了N轮之后,谁赢了? 输入 输入的第一行包含一个整数K,表
FusionCharts可以在点上定义钻取,实现各种link功能,包括: (1)同一窗口实现钻取 (2)新窗口中实现钻取 (3)在指定的frame中实现钻取 (4) 在弹出窗口中实现钻取 (5) 触发js的函数 一. 同一窗口实现钻取 在set上定义link,如: &set ... value='2235' ... link='ShowDetails.asp%3FMonth%3DJan' ...& XML Example: & chart caption='Monthly Sales S
首先,在移植systemtap前需要编译和定制自己的android系统,参照前一篇文章:移植并定制自己的Android:http://my.codeweblog.com/u/561492/blog/160274,在板子上定制自己的android系统! 读者可以以本篇博客作为参考,同时可以参考下面两篇内容,一篇Systemtap官网的教程,一篇是一个前辈写的博客 http://omappedia.org/wiki/Systemtap http://blog.csdn.net/lzuzhp06/ar
项目结构如图一: 第一步,新建PictureCode.java: package com. import java.awt.BasicS import java.awt.C import java.awt.F import java.awt.G import java.awt.Graphics2D; import java.awt.geom.AffineT import java.awt.geom.Line2D; i
注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVCodecContext FFMPEG结构体分析:AVIOContext FFMPEG结构体分析:AVCodec FFMPEG结构体分析:AVStream FFMPEG结构体分析:AVPacket FFMPEG有几个最重要的结构体,包含了解协议,解封装,解码操作,此前已经进行过分析: FFMPEG中最关键的结构体之间的
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.058 (s). 11 q(s)}

我要回帖

更多关于 结构体的定义 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信