爱一生的人 發表於 2023-7-18 00:00:00

linux epoll机制详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>
        <span>select()和poll() io多路复用模型</span>
</li><li>
        epoll io多路复用模型实现机制</li><li>
        epoll实现机制</li><li>
        epoll的接口</li><li>
        epoll的工作模式</li><li>
        示例说明:</li><li>
        示例</li><li>
        <span><strong>总结</strong></span>
</li></ul></div><p>
        在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等io多路复用的方法来实现并发服务程序。在linux新的内核中,有了一种替换它的机制,就是epoll。</p>
<p class="maodian"></p><h2>
        <span>select()和poll() io多路复用模型</span>
</h2>
<p>
        <strong>select的缺点: </strong></p>
<p>
        1.单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量,但由于select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差;(在linux内核头文件中,有这样的定义:#define __fd_setsize 1024)<br>
        2.内核 / 用户空间内存拷贝问题,select需要复制大量的句柄数据结构,产生巨大的开销;<br>
        3.select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件;<br>
        4.select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行io操作,那么之后每次select调用还是会将这些文件描述符通知进程。</p>
<p>
        相比select模型,poll使用链表保存文件描述符,因此没有了监视文件数量的限制,但其他三个缺点依然存在。</p>
<p>
        假设我们的服务器需要支持100万的并发连接,则在__fd_setsize 为1024的情况下,则我们至少需要开辟1k个进程才能实现100万的并发连接。除了进程间上下文切换的时间消耗外,从内核/用户空间大量的无脑内存拷贝、数组轮询等,是系统难以承受的。因此,基于select模型的服务器程序,要达到10万级别的并发访问,是一个很难完成的任务。</p>
<p class="maodian"></p><h2>
        epoll io多路复用模型实现机制</h2>
<p>
        由于epoll的实现机制与select/poll机制完全不同,上面所说的 select的缺点在epoll上不复存在。</p>
<p>
        设想一下如下场景:有100万个客户端同时与一个服务器进程保持着tcp连接。而每一时刻,通常只有几百上千个tcp连接是活跃的(事实上大部分场景都是这种情况)。如何实现这样的高并发?</p>
<p>
        在select/poll时代,服务器进程每次都把这100万个连接告诉操作系统(从用户态复制句柄数据结构到内核态),让操作系统内核去查询这些套接字上是否有事件发生,轮询完后,再将句柄数据复制到用户态,让服务器应用程序轮询处理已发生的网络事件,这一过程资源消耗较大,因此,select/poll一般只能处理几千的并发连接。</p>
<p>
        epoll的设计和实现与select完全不同。epoll通过在linux内核中申请一个简易的文件系统(文件系统一般用什么数据结构实现?b+树)。把原先的select/poll调用分成了3个部分:</p>
<p>
        1)调用epoll_create()建立一个epoll对象(在epoll文件系统中为这个句柄对象分配资源)</p>
<p>
        2)调用epoll_ctl向epoll对象中添加这100万个连接的套接字</p>
<p>
        3)调用epoll_wait收集发生的事件的连接</p>
<p>
        如此一来,要实现上面说是的场景,只需要在进程启动时建立一个epoll对象,然后在需要的时候向这个epoll对象中添加或者删除连接。同时,epoll_wait的效率也非常高,因为调用epoll_wait时,并没有一股脑的向操作系统复制这100万个连接的句柄数据,内核也不需要去遍历全部的连接。</p>
<p class="maodian"></p><h2>
        epoll实现机制</h2>
<p>
        当某一进程调用epoll_create方法时,linux内核会创建一个eventpoll结构体,这个结构体中有两个成员与epoll的使用方式密切相关。eventpoll结构体如下所示:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_815415">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">eventpoll{</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">....</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">/*红黑树的根节点,这颗树中存储着所有添加到epoll中的需要监控的事件*/</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">rb_root rbr;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">/*双链表中则存放着将要通过epoll_wait返回给用户的满足条件的事件*/</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">list_head rdlist;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">....</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp plain">};</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        每一个epoll对象都有一个独立的eventpoll结构体,用于存放通过epoll_ctl方法向epoll对象中添加进来的事件。这些事件都会挂载在红黑树中,如此,重复添加的事件就可以通过红黑树而高效的识别出来(红黑树的插入时间效率是lgn,其中n为树的高度)。</p>
<p>
        而所有<strong>添加到epoll中的事件都会与设备(网卡)驱动程序建立回调关系,也就是说,当相应的事件发生时会调用这个回调方法</strong>。这个回调方法在内核中叫ep_poll_callback,它会将发生的事件添加到rdlist双链表中。</p>
<p>
        在epoll中,对于每一个事件,都会建立一个epitem结构体,如下所示:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_568272">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">epitem{</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">rb_node rbn;</code><code class="cpp comments">//红黑树节点</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">list_head rdllink;</code><code class="cpp comments">//双向链表节点</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">epoll_filefd ffd; </code><code class="cpp comments">//事件句柄信息</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">eventpoll *ep; </code><code class="cpp comments">//指向其所属的eventpoll对象</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">epoll_event event; </code><code class="cpp comments">//期待发生的事件类型</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        当调用epoll_wait检查是否有事件发生时,只需要检查eventpoll对象中的rdlist双链表中是否有epitem元素即可。如果rdlist不为空,则把发生的事件复制到用户态,同时将事件数量返回给用户。</p>
<p>
        <img title="linux epoll机制详解" alt="linux epoll机制详解" id="theimg" src="https://zhuji.jb51.net/uploads/img/202305/86e85b7a49d135d5850b6988f2df9819.jpg"></p>
<p>
        通过红黑树和双链表数据结构,并结合回调机制,造就了epoll的高效。</p>
<p class="maodian"></p><h2>
        epoll的接口</h2>
<p>
        <strong>1.epoll_create </strong></p>
<p>
        创建epoll句柄<br>
        函数声明:int epoll_create(int size)</p>
<p>
        参数:size用来告诉内核这个监听的数目一共有多大。<br>
        返回值:返回创建了的epoll句柄。<br>
        当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。</p>
<p>
        <strong>2.epoll_ctl </strong></p>
<p>
        将被监听的描述符添加到epoll句柄或从epool句柄中删除或者对监听事件进行修改。<br>
        函数申明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event*event);</p>
<p>
        参数:<br>
        epfd: epoll_create()的返回值<br>
        op:表示要进行的操作,其值分别为:<br>
        epoll_ctl_add: 注册新的fd到epfd中;<br>
        epoll_ctl_mod: 修改已经注册的fd的监听事件;<br>
        epoll_ctl_del: 从epfd中删除一个fd;<br>
        fd:需要操作/监听的文件句柄<br>
        event:是告诉内核需要监听什么事件,struct epoll_event如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_469590">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">union</code> <code class="cpp plain">epoll_data { </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp keyword bold">void</code> <code class="cpp plain">*ptr; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">fd; </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp plain">__uint32_t u32; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp plain">__uint64_t u64; </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp plain">} epoll_data_t; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                         </div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">epoll_event { </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp plain">__uint32_t events; </code><code class="cpp comments">/* epoll events */</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp plain">epoll_data_t data; </code><code class="cpp comments">/* user data variable */</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp plain">};</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        events可以是以下几个宏的集合:</p>
<p>
        epollin:触发该事件,表示对应的文件描述符上有可读数据。(包括对端socket正常关闭);<br>
        epollout:触发该事件,表示对应的文件描述符上可以写数据;<br>
        epollpri:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);<br>
        epollerr:表示对应的文件描述符发生错误;<br>
        epollhup: 表示对应的文件描述符被挂断;<br>
        epollet:将epoll设为边缘触发(edgetriggered)模式,这是相对于水平触发(level triggered)来说的。<br>
        epolloneshot: 只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到epoll队列里。</p>
<p>
        示例:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_779900">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp keyword bold">struct</code> <code class="cpp plain">epoll_event ev;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp comments">//设置与要处理的事件相关的文件描述符</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp plain">ev.data.fd=listenfd;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp comments">//设置要处理的事件类型</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp plain">ev.events=epollin|epollet;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp comments">//注册epoll事件</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp plain">epoll_ctl(epfd,epoll_ctl_add,listenfd,&amp;ev);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong>1.epoll_wait </strong></p>
<p>
        等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sokct fd和事件类型放入到events数组中。<br>
        函数原型:<code>int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); </code></p>
<p>
        参数:<br>
        epfd:由epoll_create 生成的epoll文件描述符<br>
        events:用于回传代处理事件的数组<br>
        maxevents:每次能处理的最大事件数<br>
        timeout:等待i/o事件发生的超时毫秒数,-1相当于阻塞,0相当于非阻塞。一般用-1即可</p>
<p class="maodian"></p><h2>
        epoll的工作模式</h2>
<p>
        et(edgetriggered):高速工作模式,只支持no_block(非阻塞模式)。在此模式下,当描述符从未就绪变为就绪时,内核通过epoll告知。然后它会假设用户知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到某些操作导致那个文件描述符不再为就绪状态了。(触发模式只在数据就绪时通知一次,若数据没有读完,下一次不会通知,直到有新的就绪数据)</p>
<p>
        lt(leveltriggered):缺省工作方式,支持blocksocket和no_blocksocket。在lt模式下内核会告知一个文件描述符是否就绪了,然后可以对这个就绪的fd进行io操作。如果不作任何操作,内核还是会继续通知!若数据没有读完,内核也会继续通知,直至设备数据为空为止!</p>
<p class="maodian"></p><h2>
        示例说明:</h2>
<p>
        1.我们已经把一个用来从管道中读取数据的文件句柄(rfd)添加到epoll描述符<br>
        2. 这个时候从管道的另一端被写入了2kb的数据<br>
        3. 调用epoll_wait(2),并且它会返回rfd,说明它已经准备好读取操作<br>
        4. 然后我们读取了1kb的数据<br>
        5. 调用epoll_wait(2)……</p>
<p>
        <strong>et工作模式: </strong></p>
<p>
        如果我们在第1步将rfd添加到epoll描述符的时候使用了epollet标志,在第2步执行了一个写操作,第三步epoll_wait会返回同时通知的事件会销毁。因为第4步的读取操作没有读空文件输入缓冲区内的数据,因此我们在第5步调用epoll_wait(2)完成后,是否挂起是不确定的。epoll工作在et模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。</p>
<p>
        只有当read(2)或者write(2)返回eagain时(认为读完)才需要挂起,等待。但这并不是说每次read()时都需要循环读,直到读到产生一个eagain才认为此次事件处理完成,当read()返回的读到的数据长度小于请求的数据长度时(即小于sizeof(buf)),就可以确定此时缓冲中已没有数据了,也就可以认为此事读事件已处理完成。</p>
<p>
        <strong>lt工作模式:</strong></p>
<p>
        lt方式调用epoll接口的时候,它就相当于一个速度比较快的poll(2),并且无论后面的数据是否被使用,因此他们具有同样的职能。</p>
<p class="maodian"></p><h2>
        示例</h2>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_509938">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                        <div class="line number44 index43 alt1">
                                                                44</div>
                                                        <div class="line number45 index44 alt2">
                                                                45</div>
                                                        <div class="line number46 index45 alt1">
                                                                46</div>
                                                        <div class="line number47 index46 alt2">
                                                                47</div>
                                                        <div class="line number48 index47 alt1">
                                                                48</div>
                                                        <div class="line number49 index48 alt2">
                                                                49</div>
                                                        <div class="line number50 index49 alt1">
                                                                50</div>
                                                        <div class="line number51 index50 alt2">
                                                                51</div>
                                                        <div class="line number52 index51 alt1">
                                                                52</div>
                                                        <div class="line number53 index52 alt2">
                                                                53</div>
                                                        <div class="line number54 index53 alt1">
                                                                54</div>
                                                        <div class="line number55 index54 alt2">
                                                                55</div>
                                                        <div class="line number56 index55 alt1">
                                                                56</div>
                                                        <div class="line number57 index56 alt2">
                                                                57</div>
                                                        <div class="line number58 index57 alt1">
                                                                58</div>
                                                        <div class="line number59 index58 alt2">
                                                                59</div>
                                                        <div class="line number60 index59 alt1">
                                                                60</div>
                                                        <div class="line number61 index60 alt2">
                                                                61</div>
                                                        <div class="line number62 index61 alt1">
                                                                62</div>
                                                        <div class="line number63 index62 alt2">
                                                                63</div>
                                                        <div class="line number64 index63 alt1">
                                                                64</div>
                                                        <div class="line number65 index64 alt2">
                                                                65</div>
                                                        <div class="line number66 index65 alt1">
                                                                66</div>
                                                        <div class="line number67 index66 alt2">
                                                                67</div>
                                                        <div class="line number68 index67 alt1">
                                                                68</div>
                                                        <div class="line number69 index68 alt2">
                                                                69</div>
                                                        <div class="line number70 index69 alt1">
                                                                70</div>
                                                        <div class="line number71 index70 alt2">
                                                                71</div>
                                                        <div class="line number72 index71 alt1">
                                                                72</div>
                                                        <div class="line number73 index72 alt2">
                                                                73</div>
                                                        <div class="line number74 index73 alt1">
                                                                74</div>
                                                        <div class="line number75 index74 alt2">
                                                                75</div>
                                                        <div class="line number76 index75 alt1">
                                                                76</div>
                                                        <div class="line number77 index76 alt2">
                                                                77</div>
                                                        <div class="line number78 index77 alt1">
                                                                78</div>
                                                        <div class="line number79 index78 alt2">
                                                                79</div>
                                                        <div class="line number80 index79 alt1">
                                                                80</div>
                                                        <div class="line number81 index80 alt2">
                                                                81</div>
                                                        <div class="line number82 index81 alt1">
                                                                82</div>
                                                        <div class="line number83 index82 alt2">
                                                                83</div>
                                                        <div class="line number84 index83 alt1">
                                                                84</div>
                                                        <div class="line number85 index84 alt2">
                                                                85</div>
                                                        <div class="line number86 index85 alt1">
                                                                86</div>
                                                        <div class="line number87 index86 alt2">
                                                                87</div>
                                                        <div class="line number88 index87 alt1">
                                                                88</div>
                                                        <div class="line number89 index88 alt2">
                                                                89</div>
                                                        <div class="line number90 index89 alt1">
                                                                90</div>
                                                        <div class="line number91 index90 alt2">
                                                                91</div>
                                                        <div class="line number92 index91 alt1">
                                                                92</div>
                                                        <div class="line number93 index92 alt2">
                                                                93</div>
                                                        <div class="line number94 index93 alt1">
                                                                94</div>
                                                        <div class="line number95 index94 alt2">
                                                                95</div>
                                                        <div class="line number96 index95 alt1">
                                                                96</div>
                                                        <div class="line number97 index96 alt2">
                                                                97</div>
                                                        <div class="line number98 index97 alt1">
                                                                98</div>
                                                        <div class="line number99 index98 alt2">
                                                                99</div>
                                                        <div class="line number100 index99 alt1">
                                                                100</div>
                                                        <div class="line number101 index100 alt2">
                                                                101</div>
                                                        <div class="line number102 index101 alt1">
                                                                102</div>
                                                        <div class="line number103 index102 alt2">
                                                                103</div>
                                                        <div class="line number104 index103 alt1">
                                                                104</div>
                                                        <div class="line number105 index104 alt2">
                                                                105</div>
                                                        <div class="line number106 index105 alt1">
                                                                106</div>
                                                        <div class="line number107 index106 alt2">
                                                                107</div>
                                                        <div class="line number108 index107 alt1">
                                                                108</div>
                                                        <div class="line number109 index108 alt2">
                                                                109</div>
                                                        <div class="line number110 index109 alt1">
                                                                110</div>
                                                        <div class="line number111 index110 alt2">
                                                                111</div>
                                                        <div class="line number112 index111 alt1">
                                                                112</div>
                                                        <div class="line number113 index112 alt2">
                                                                113</div>
                                                        <div class="line number114 index113 alt1">
                                                                114</div>
                                                        <div class="line number115 index114 alt2">
                                                                115</div>
                                                        <div class="line number116 index115 alt1">
                                                                116</div>
                                                        <div class="line number117 index116 alt2">
                                                                117</div>
                                                        <div class="line number118 index117 alt1">
                                                                118</div>
                                                        <div class="line number119 index118 alt2">
                                                                119</div>
                                                        <div class="line number120 index119 alt1">
                                                                120</div>
                                                        <div class="line number121 index120 alt2">
                                                                121</div>
                                                        <div class="line number122 index121 alt1">
                                                                122</div>
                                                        <div class="line number123 index122 alt2">
                                                                123</div>
                                                        <div class="line number124 index123 alt1">
                                                                124</div>
                                                        <div class="line number125 index124 alt2">
                                                                125</div>
                                                        <div class="line number126 index125 alt1">
                                                                126</div>
                                                        <div class="line number127 index126 alt2">
                                                                127</div>
                                                        <div class="line number128 index127 alt1">
                                                                128</div>
                                                        <div class="line number129 index128 alt2">
                                                                129</div>
                                                        <div class="line number130 index129 alt1">
                                                                130</div>
                                                        <div class="line number131 index130 alt2">
                                                                131</div>
                                                        <div class="line number132 index131 alt1">
                                                                132</div>
                                                        <div class="line number133 index132 alt2">
                                                                133</div>
                                                        <div class="line number134 index133 alt1">
                                                                134</div>
                                                        <div class="line number135 index134 alt2">
                                                                135</div>
                                                        <div class="line number136 index135 alt1">
                                                                136</div>
                                                        <div class="line number137 index136 alt2">
                                                                137</div>
                                                        <div class="line number138 index137 alt1">
                                                                138</div>
                                                        <div class="line number139 index138 alt2">
                                                                139</div>
                                                        <div class="line number140 index139 alt1">
                                                                140</div>
                                                        <div class="line number141 index140 alt2">
                                                                141</div>
                                                        <div class="line number142 index141 alt1">
                                                                142</div>
                                                        <div class="line number143 index142 alt2">
                                                                143</div>
                                                        <div class="line number144 index143 alt1">
                                                                144</div>
                                                        <div class="line number145 index144 alt2">
                                                                145</div>
                                                        <div class="line number146 index145 alt1">
                                                                146</div>
                                                        <div class="line number147 index146 alt2">
                                                                147</div>
                                                        <div class="line number148 index147 alt1">
                                                                148</div>
                                                        <div class="line number149 index148 alt2">
                                                                149</div>
                                                        <div class="line number150 index149 alt1">
                                                                150</div>
                                                        <div class="line number151 index150 alt2">
                                                                151</div>
                                                        <div class="line number152 index151 alt1">
                                                                152</div>
                                                        <div class="line number153 index152 alt2">
                                                                153</div>
                                                        <div class="line number154 index153 alt1">
                                                                154</div>
                                                        <div class="line number155 index154 alt2">
                                                                155</div>
                                                        <div class="line number156 index155 alt1">
                                                                156</div>
                                                        <div class="line number157 index156 alt2">
                                                                157</div>
                                                        <div class="line number158 index157 alt1">
                                                                158</div>
                                                        <div class="line number159 index158 alt2">
                                                                159</div>
                                                        <div class="line number160 index159 alt1">
                                                                160</div>
                                                        <div class="line number161 index160 alt2">
                                                                161</div>
                                                        <div class="line number162 index161 alt1">
                                                                162</div>
                                                        <div class="line number163 index162 alt2">
                                                                163</div>
                                                        <div class="line number164 index163 alt1">
                                                                164</div>
                                                        <div class="line number165 index164 alt2">
                                                                165</div>
                                                        <div class="line number166 index165 alt1">
                                                                166</div>
                                                        <div class="line number167 index166 alt2">
                                                                167</div>
                                                        <div class="line number168 index167 alt1">
                                                                168</div>
                                                        <div class="line number169 index168 alt2">
                                                                169</div>
                                                        <div class="line number170 index169 alt1">
                                                                170</div>
                                                        <div class="line number171 index170 alt2">
                                                                171</div>
                                                        <div class="line number172 index171 alt1">
                                                                172</div>
                                                        <div class="line number173 index172 alt2">
                                                                173</div>
                                                        <div class="line number174 index173 alt1">
                                                                174</div>
                                                        <div class="line number175 index174 alt2">
                                                                175</div>
                                                        <div class="line number176 index175 alt1">
                                                                176</div>
                                                        <div class="line number177 index176 alt2">
                                                                177</div>
                                                        <div class="line number178 index177 alt1">
                                                                178</div>
                                                        <div class="line number179 index178 alt2">
                                                                179</div>
                                                        <div class="line number180 index179 alt1">
                                                                180</div>
                                                        <div class="line number181 index180 alt2">
                                                                181</div>
                                                        <div class="line number182 index181 alt1">
                                                                182</div>
                                                        <div class="line number183 index182 alt2">
                                                                183</div>
                                                        <div class="line number184 index183 alt1">
                                                                184</div>
                                                        <div class="line number185 index184 alt2">
                                                                185</div>
                                                        <div class="line number186 index185 alt1">
                                                                186</div>
                                                        <div class="line number187 index186 alt2">
                                                                187</div>
                                                        <div class="line number188 index187 alt1">
                                                                188</div>
                                                        <div class="line number189 index188 alt2">
                                                                189</div>
                                                        <div class="line number190 index189 alt1">
                                                                190</div>
                                                        <div class="line number191 index190 alt2">
                                                                191</div>
                                                        <div class="line number192 index191 alt1">
                                                                192</div>
                                                        <div class="line number193 index192 alt2">
                                                                193</div>
                                                        <div class="line number194 index193 alt1">
                                                                194</div>
                                                        <div class="line number195 index194 alt2">
                                                                195</div>
                                                        <div class="line number196 index195 alt1">
                                                                196</div>
                                                        <div class="line number197 index196 alt2">
                                                                197</div>
                                                        <div class="line number198 index197 alt1">
                                                                198</div>
                                                        <div class="line number199 index198 alt2">
                                                                199</div>
                                                        <div class="line number200 index199 alt1">
                                                                200</div>
                                                        <div class="line number201 index200 alt2">
                                                                201</div>
                                                        <div class="line number202 index201 alt1">
                                                                202</div>
                                                        <div class="line number203 index202 alt2">
                                                                203</div>
                                                        <div class="line number204 index203 alt1">
                                                                204</div>
                                                        <div class="line number205 index204 alt2">
                                                                205</div>
                                                        <div class="line number206 index205 alt1">
                                                                206</div>
                                                        <div class="line number207 index206 alt2">
                                                                207</div>
                                                        <div class="line number208 index207 alt1">
                                                                208</div>
                                                        <div class="line number209 index208 alt2">
                                                                209</div>
                                                        <div class="line number210 index209 alt1">
                                                                210</div>
                                                        <div class="line number211 index210 alt2">
                                                                211</div>
                                                        <div class="line number212 index211 alt1">
                                                                212</div>
                                                        <div class="line number213 index212 alt2">
                                                                213</div>
                                                        <div class="line number214 index213 alt1">
                                                                214</div>
                                                        <div class="line number215 index214 alt2">
                                                                215</div>
                                                        <div class="line number216 index215 alt1">
                                                                216</div>
                                                        <div class="line number217 index216 alt2">
                                                                217</div>
                                                        <div class="line number218 index217 alt1">
                                                                218</div>
                                                        <div class="line number219 index218 alt2">
                                                                219</div>
                                                        <div class="line number220 index219 alt1">
                                                                220</div>
                                                        <div class="line number221 index220 alt2">
                                                                221</div>
                                                        <div class="line number222 index221 alt1">
                                                                222</div>
                                                        <div class="line number223 index222 alt2">
                                                                223</div>
                                                        <div class="line number224 index223 alt1">
                                                                224</div>
                                                        <div class="line number225 index224 alt2">
                                                                225</div>
                                                        <div class="line number226 index225 alt1">
                                                                226</div>
                                                        <div class="line number227 index226 alt2">
                                                                227</div>
                                                        <div class="line number228 index227 alt1">
                                                                228</div>
                                                        <div class="line number229 index228 alt2">
                                                                229</div>
                                                        <div class="line number230 index229 alt1">
                                                                230</div>
                                                        <div class="line number231 index230 alt2">
                                                                231</div>
                                                        <div class="line number232 index231 alt1">
                                                                232</div>
                                                        <div class="line number233 index232 alt2">
                                                                233</div>
                                                        <div class="line number234 index233 alt1">
                                                                234</div>
                                                        <div class="line number235 index234 alt2">
                                                                235</div>
                                                        <div class="line number236 index235 alt1">
                                                                236</div>
                                                        <div class="line number237 index236 alt2">
                                                                237</div>
                                                        <div class="line number238 index237 alt1">
                                                                238</div>
                                                        <div class="line number239 index238 alt2">
                                                                239</div>
                                                        <div class="line number240 index239 alt1">
                                                                240</div>
                                                        <div class="line number241 index240 alt2">
                                                                241</div>
                                                        <div class="line number242 index241 alt1">
                                                                242</div>
                                                        <div class="line number243 index242 alt2">
                                                                243</div>
                                                        <div class="line number244 index243 alt1">
                                                                244</div>
                                                        <div class="line number245 index244 alt2">
                                                                245</div>
                                                        <div class="line number246 index245 alt1">
                                                                246</div>
                                                        <div class="line number247 index246 alt2">
                                                                247</div>
                                                        <div class="line number248 index247 alt1">
                                                                248</div>
                                                        <div class="line number249 index248 alt2">
                                                                249</div>
                                                        <div class="line number250 index249 alt1">
                                                                250</div>
                                                        <div class="line number251 index250 alt2">
                                                                251</div>
                                                        <div class="line number252 index251 alt1">
                                                                252</div>
                                                        <div class="line number253 index252 alt2">
                                                                253</div>
                                                        <div class="line number254 index253 alt1">
                                                                254</div>
                                                        <div class="line number255 index254 alt2">
                                                                255</div>
                                                        <div class="line number256 index255 alt1">
                                                                256</div>
                                                        <div class="line number257 index256 alt2">
                                                                257</div>
                                                        <div class="line number258 index257 alt1">
                                                                258</div>
                                                        <div class="line number259 index258 alt2">
                                                                259</div>
                                                        <div class="line number260 index259 alt1">
                                                                260</div>
                                                        <div class="line number261 index260 alt2">
                                                                261</div>
                                                        <div class="line number262 index261 alt1">
                                                                262</div>
                                                        <div class="line number263 index262 alt2">
                                                                263</div>
                                                        <div class="line number264 index263 alt1">
                                                                264</div>
                                                        <div class="line number265 index264 alt2">
                                                                265</div>
                                                        <div class="line number266 index265 alt1">
                                                                266</div>
                                                        <div class="line number267 index266 alt2">
                                                                267</div>
                                                        <div class="line number268 index267 alt1">
                                                                268</div>
                                                        <div class="line number269 index268 alt2">
                                                                269</div>
                                                        <div class="line number270 index269 alt1">
                                                                270</div>
                                                        <div class="line number271 index270 alt2">
                                                                271</div>
                                                        <div class="line number272 index271 alt1">
                                                                272</div>
                                                        <div class="line number273 index272 alt2">
                                                                273</div>
                                                        <div class="line number274 index273 alt1">
                                                                274</div>
                                                        <div class="line number275 index274 alt2">
                                                                275</div>
                                                        <div class="line number276 index275 alt1">
                                                                276</div>
                                                        <div class="line number277 index276 alt2">
                                                                277</div>
                                                        <div class="line number278 index277 alt1">
                                                                278</div>
                                                        <div class="line number279 index278 alt2">
                                                                279</div>
                                                        <div class="line number280 index279 alt1">
                                                                280</div>
                                                        <div class="line number281 index280 alt2">
                                                                281</div>
                                                        <div class="line number282 index281 alt1">
                                                                282</div>
                                                        <div class="line number283 index282 alt2">
                                                                283</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp comments">/*</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp comments">* file epolltest.c</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp comments">*/</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;stdlib.h&gt; </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;errno.h&gt; </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;sys/socket.h&gt; </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;netdb.h&gt; </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;fcntl.h&gt; </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/epoll.h&gt; </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;string.h&gt; </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                         </div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp preprocessor">#define maxevents 64 </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                         </div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp comments">//函数: </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp comments">//功能:创建和绑定一个tcp socket </code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp comments">//参数:端口 </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp comments">//返回值:创建的socket </code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp plain">create_and_bind (</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*port) </code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">addrinfo hints; </code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">addrinfo *result, *rp; </code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">s, sfd; </code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                         </div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">memset</code> <code class="cpp plain">(&amp;hints, 0, </code><code class="cpp keyword bold">sizeof</code> <code class="cpp plain">(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">addrinfo)); </code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">hints.ai_family = af_unspec;  </code><code class="cpp comments">/* return ipv4 and ipv6 choices */</code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">hints.ai_socktype = sock_stream; </code><code class="cpp comments">/* we want a tcp socket */</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">hints.ai_flags = ai_passive;  </code><code class="cpp comments">/* all interfaces */</code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                         </div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">s = getaddrinfo (null, port, &amp;hints, &amp;result); </code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s != 0) </code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">fprintf</code> <code class="cpp plain">(stderr, </code><code class="cpp string">"getaddrinfo: %s\n"</code><code class="cpp plain">, gai_strerror (s)); </code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1; </code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                         </div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(rp = result; rp != null; rp = rp-&gt;ai_next) </code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">sfd = socket (rp-&gt;ai_family, rp-&gt;ai_socktype, rp-&gt;ai_protocol); </code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(sfd == -1) </code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">continue</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number44 index43 alt1">
                                                                         </div>
                                                                <div class="line number45 index44 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">s = bind (sfd, rp-&gt;ai_addr, rp-&gt;ai_addrlen); </code>
</div>
                                                                <div class="line number46 index45 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == 0) </code>
</div>
                                                                <div class="line number47 index46 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number48 index47 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp comments">/* we managed to bind successfully! */</code>
</div>
                                                                <div class="line number49 index48 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number50 index49 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number51 index50 alt2">
                                                                         </div>
                                                                <div class="line number52 index51 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">close (sfd); </code>
</div>
                                                                <div class="line number53 index52 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number54 index53 alt1">
                                                                         </div>
                                                                <div class="line number55 index54 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(rp == null) </code>
</div>
                                                                <div class="line number56 index55 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number57 index56 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">fprintf</code> <code class="cpp plain">(stderr, </code><code class="cpp string">"could not bind\n"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number58 index57 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1; </code>
</div>
                                                                <div class="line number59 index58 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number60 index59 alt1">
                                                                         </div>
                                                                <div class="line number61 index60 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">freeaddrinfo (result); </code>
</div>
                                                                <div class="line number62 index61 alt1">
                                                                         </div>
                                                                <div class="line number63 index62 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">sfd; </code>
</div>
                                                                <div class="line number64 index63 alt1">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number65 index64 alt2">
                                                                         </div>
                                                                <div class="line number66 index65 alt1">
                                                                         </div>
                                                                <div class="line number67 index66 alt2">
                                                                        <code class="cpp comments">//函数 </code>
</div>
                                                                <div class="line number68 index67 alt1">
                                                                        <code class="cpp comments">//功能:设置socket为非阻塞的 </code>
</div>
                                                                <div class="line number69 index68 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code>
</div>
                                                                <div class="line number70 index69 alt1">
                                                                        <code class="cpp plain">make_socket_non_blocking (</code><code class="cpp color1 bold">int</code> <code class="cpp plain">sfd) </code>
</div>
                                                                <div class="line number71 index70 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number72 index71 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">flags, s; </code>
</div>
                                                                <div class="line number73 index72 alt2">
                                                                         </div>
                                                                <div class="line number74 index73 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">//得到文件状态标志 </code>
</div>
                                                                <div class="line number75 index74 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">flags = fcntl (sfd, f_getfl, 0); </code>
</div>
                                                                <div class="line number76 index75 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(flags == -1) </code>
</div>
                                                                <div class="line number77 index76 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number78 index77 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"fcntl"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number79 index78 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1; </code>
</div>
                                                                <div class="line number80 index79 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number81 index80 alt2">
                                                                         </div>
                                                                <div class="line number82 index81 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">//设置文件状态标志 </code>
</div>
                                                                <div class="line number83 index82 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">flags |= o_nonblock; </code>
</div>
                                                                <div class="line number84 index83 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">s = fcntl (sfd, f_setfl, flags); </code>
</div>
                                                                <div class="line number85 index84 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == -1) </code>
</div>
                                                                <div class="line number86 index85 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number87 index86 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"fcntl"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number88 index87 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1; </code>
</div>
                                                                <div class="line number89 index88 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number90 index89 alt1">
                                                                         </div>
                                                                <div class="line number91 index90 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number92 index91 alt1">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number93 index92 alt2">
                                                                         </div>
                                                                <div class="line number94 index93 alt1">
                                                                        <code class="cpp comments">//端口由参数argv指定 </code>
</div>
                                                                <div class="line number95 index94 alt2">
                                                                        <code class="cpp color1 bold">int</code>
</div>
                                                                <div class="line number96 index95 alt1">
                                                                        <code class="cpp plain">main (</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*argv[]) </code>
</div>
                                                                <div class="line number97 index96 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number98 index97 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">sfd, s; </code>
</div>
                                                                <div class="line number99 index98 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">efd; </code>
</div>
                                                                <div class="line number100 index99 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">epoll_event event; </code>
</div>
                                                                <div class="line number101 index100 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">epoll_event *events; </code>
</div>
                                                                <div class="line number102 index101 alt1">
                                                                         </div>
                                                                <div class="line number103 index102 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(argc != 2) </code>
</div>
                                                                <div class="line number104 index103 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number105 index104 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">fprintf</code> <code class="cpp plain">(stderr, </code><code class="cpp string">"usage: %s \n"</code><code class="cpp plain">, argv); </code>
</div>
                                                                <div class="line number106 index105 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">exit</code> <code class="cpp plain">(exit_failure); </code>
</div>
                                                                <div class="line number107 index106 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number108 index107 alt1">
                                                                         </div>
                                                                <div class="line number109 index108 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">sfd = create_and_bind (argv); </code>
</div>
                                                                <div class="line number110 index109 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(sfd == -1) </code>
</div>
                                                                <div class="line number111 index110 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">abort</code> <code class="cpp plain">(); </code>
</div>
                                                                <div class="line number112 index111 alt1">
                                                                         </div>
                                                                <div class="line number113 index112 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">s = make_socket_non_blocking (sfd); </code>
</div>
                                                                <div class="line number114 index113 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == -1) </code>
</div>
                                                                <div class="line number115 index114 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">abort</code> <code class="cpp plain">(); </code>
</div>
                                                                <div class="line number116 index115 alt1">
                                                                         </div>
                                                                <div class="line number117 index116 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">s = listen (sfd, somaxconn); </code>
</div>
                                                                <div class="line number118 index117 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == -1) </code>
</div>
                                                                <div class="line number119 index118 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number120 index119 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"listen"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number121 index120 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">abort</code> <code class="cpp plain">(); </code>
</div>
                                                                <div class="line number122 index121 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number123 index122 alt2">
                                                                         </div>
                                                                <div class="line number124 index123 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">//除了参数size被忽略外,此函数和epoll_create完全相同 </code>
</div>
                                                                <div class="line number125 index124 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">efd = epoll_create1 (0); </code>
</div>
                                                                <div class="line number126 index125 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(efd == -1) </code>
</div>
                                                                <div class="line number127 index126 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number128 index127 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"epoll_create"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number129 index128 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">abort</code> <code class="cpp plain">(); </code>
</div>
                                                                <div class="line number130 index129 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number131 index130 alt2">
                                                                         </div>
                                                                <div class="line number132 index131 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">event.data.fd = sfd; </code>
</div>
                                                                <div class="line number133 index132 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">event.events = epollin | epollet;</code><code class="cpp comments">//读入,边缘触发方式 </code>
</div>
                                                                <div class="line number134 index133 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">s = epoll_ctl (efd, epoll_ctl_add, sfd, &amp;event); </code>
</div>
                                                                <div class="line number135 index134 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == -1) </code>
</div>
                                                                <div class="line number136 index135 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number137 index136 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"epoll_ctl"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number138 index137 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">abort</code> <code class="cpp plain">(); </code>
</div>
                                                                <div class="line number139 index138 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number140 index139 alt1">
                                                                         </div>
                                                                <div class="line number141 index140 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">/* buffer where events are returned */</code>
</div>
                                                                <div class="line number142 index141 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">events = </code><code class="cpp functions bold">calloc</code> <code class="cpp plain">(maxevents, </code><code class="cpp keyword bold">sizeof</code> <code class="cpp plain">event); </code>
</div>
                                                                <div class="line number143 index142 alt2">
                                                                         </div>
                                                                <div class="line number144 index143 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">/* the event loop */</code>
</div>
                                                                <div class="line number145 index144 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">while</code> <code class="cpp plain">(1) </code>
</div>
                                                                <div class="line number146 index145 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number147 index146 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">n, i; </code>
</div>
                                                                <div class="line number148 index147 alt1">
                                                                         </div>
                                                                <div class="line number149 index148 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">n = epoll_wait (efd, events, maxevents, -1); </code>
</div>
                                                                <div class="line number150 index149 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(i = 0; i &lt; n; i++) </code>
</div>
                                                                <div class="line number151 index150 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number152 index151 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((events.events &amp; epollerr) || </code>
</div>
                                                                <div class="line number153 index152 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">(events.events &amp; epollhup) || </code>
</div>
                                                                <div class="line number154 index153 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">(!(events.events &amp; epollin))) </code>
</div>
                                                                <div class="line number155 index154 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number156 index155 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">/* an error has occured on this fd, or the socket is not </code>
</div>
                                                                <div class="line number157 index156 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">ready for reading (why were we notified then?) */</code>
</div>
                                                                <div class="line number158 index157 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">fprintf</code> <code class="cpp plain">(stderr, </code><code class="cpp string">"epoll error\n"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number159 index158 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">close (events.data.fd); </code>
</div>
                                                                <div class="line number160 index159 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">continue</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number161 index160 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number162 index161 alt1">
                                                                         </div>
                                                                <div class="line number163 index162 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code> <code class="cpp plain">(sfd == events.data.fd) </code>
</div>
                                                                <div class="line number164 index163 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number165 index164 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">/* we have a notification on the listening socket, which </code>
</div>
                                                                <div class="line number166 index165 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">means one or more incoming connections. */</code>
</div>
                                                                <div class="line number167 index166 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">while</code> <code class="cpp plain">(1) </code>
</div>
                                                                <div class="line number168 index167 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number169 index168 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">sockaddr in_addr; </code>
</div>
                                                                <div class="line number170 index169 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">socklen_t in_len; </code>
</div>
                                                                <div class="line number171 index170 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp color1 bold">int</code> <code class="cpp plain">infd; </code>
</div>
                                                                <div class="line number172 index171 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp color1 bold">char</code> <code class="cpp plain">hbuf, sbuf; </code>
</div>
                                                                <div class="line number173 index172 alt2">
                                                                         </div>
                                                                <div class="line number174 index173 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">in_len = </code><code class="cpp keyword bold">sizeof</code> <code class="cpp plain">in_addr; </code>
</div>
                                                                <div class="line number175 index174 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">infd = accept (sfd, &amp;in_addr, &amp;in_len); </code>
</div>
                                                                <div class="line number176 index175 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(infd == -1) </code>
</div>
                                                                <div class="line number177 index176 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number178 index177 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((</code><code class="cpp functions bold">errno</code> <code class="cpp plain">== eagain) || </code>
</div>
                                                                <div class="line number179 index178 alt2">
                                                                        <code class="cpp spaces">       </code><code class="cpp plain">(</code><code class="cpp functions bold">errno</code> <code class="cpp plain">== ewouldblock)) </code>
</div>
                                                                <div class="line number180 index179 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number181 index180 alt2">
                                                                        <code class="cpp spaces">       </code><code class="cpp comments">/* we have processed all incoming </code>
</div>
                                                                <div class="line number182 index181 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp comments">connections. */</code>
</div>
                                                                <div class="line number183 index182 alt2">
                                                                        <code class="cpp spaces">       </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number184 index183 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number185 index184 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">else</code>
</div>
                                                                <div class="line number186 index185 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number187 index186 alt2">
                                                                        <code class="cpp spaces">       </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"accept"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number188 index187 alt1">
                                                                        <code class="cpp spaces">       </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number189 index188 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number190 index189 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number191 index190 alt2">
                                                                         </div>
                                                                <div class="line number192 index191 alt1">
                                                                        <code class="cpp spaces">         </code><code class="cpp comments">//将地址转化为主机名或者服务名 </code>
</div>
                                                                <div class="line number193 index192 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">s = getnameinfo (&amp;in_addr, in_len, </code>
</div>
                                                                <div class="line number194 index193 alt1">
                                                                        <code class="cpp spaces">         </code><code class="cpp plain">hbuf, </code><code class="cpp keyword bold">sizeof</code> <code class="cpp plain">hbuf, </code>
</div>
                                                                <div class="line number195 index194 alt2">
                                                                        <code class="cpp spaces">         </code><code class="cpp plain">sbuf, </code><code class="cpp keyword bold">sizeof</code> <code class="cpp plain">sbuf, </code>
</div>
                                                                <div class="line number196 index195 alt1">
                                                                        <code class="cpp spaces">         </code><code class="cpp plain">ni_numerichost | ni_numericserv);</code><code class="cpp comments">//flag参数:以数字名返回 </code>
</div>
                                                                <div class="line number197 index196 alt2">
                                                                        <code class="cpp spaces">         </code><code class="cpp comments">//主机地址和服务地址 </code>
</div>
                                                                <div class="line number198 index197 alt1">
                                                                         </div>
                                                                <div class="line number199 index198 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == 0) </code>
</div>
                                                                <div class="line number200 index199 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number201 index200 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"accepted connection on descriptor %d "</code>
</div>
                                                                <div class="line number202 index201 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp string">"(host=%s, port=%s)\n"</code><code class="cpp plain">, infd, hbuf, sbuf); </code>
</div>
                                                                <div class="line number203 index202 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number204 index203 alt1">
                                                                         </div>
                                                                <div class="line number205 index204 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">/* make the incoming socket non-blocking and add it to the </code>
</div>
                                                                <div class="line number206 index205 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp comments">list of fds to monitor. */</code>
</div>
                                                                <div class="line number207 index206 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">s = make_socket_non_blocking (infd); </code>
</div>
                                                                <div class="line number208 index207 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == -1) </code>
</div>
                                                                <div class="line number209 index208 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp functions bold">abort</code> <code class="cpp plain">(); </code>
</div>
                                                                <div class="line number210 index209 alt1">
                                                                         </div>
                                                                <div class="line number211 index210 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">event.data.fd = infd; </code>
</div>
                                                                <div class="line number212 index211 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">event.events = epollin | epollet; </code>
</div>
                                                                <div class="line number213 index212 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">s = epoll_ctl (efd, epoll_ctl_add, infd, &amp;event); </code>
</div>
                                                                <div class="line number214 index213 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == -1) </code>
</div>
                                                                <div class="line number215 index214 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number216 index215 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"epoll_ctl"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number217 index216 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp functions bold">abort</code> <code class="cpp plain">(); </code>
</div>
                                                                <div class="line number218 index217 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number219 index218 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number220 index219 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">continue</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number221 index220 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number222 index221 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">else</code>
</div>
                                                                <div class="line number223 index222 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number224 index223 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">/* we have data on the fd waiting to be read. read and </code>
</div>
                                                                <div class="line number225 index224 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">display it. we must read whatever data is available </code>
</div>
                                                                <div class="line number226 index225 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">completely, as we are running in edge-triggered mode </code>
</div>
                                                                <div class="line number227 index226 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">and won't get a notification again for the same </code>
</div>
                                                                <div class="line number228 index227 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">data. */</code>
</div>
                                                                <div class="line number229 index228 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp color1 bold">int</code> <code class="cpp plain">done = 0; </code>
</div>
                                                                <div class="line number230 index229 alt1">
                                                                         </div>
                                                                <div class="line number231 index230 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">while</code> <code class="cpp plain">(1) </code>
</div>
                                                                <div class="line number232 index231 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number233 index232 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">ssize_t count; </code>
</div>
                                                                <div class="line number234 index233 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp color1 bold">char</code> <code class="cpp plain">buf; </code>
</div>
                                                                <div class="line number235 index234 alt2">
                                                                         </div>
                                                                <div class="line number236 index235 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">count = read (events.data.fd, buf, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(buf)); </code>
</div>
                                                                <div class="line number237 index236 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(count == -1) </code>
</div>
                                                                <div class="line number238 index237 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number239 index238 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp comments">/* if errno == eagain, that means we have read all </code>
</div>
                                                                <div class="line number240 index239 alt1">
                                                                        <code class="cpp spaces">       </code><code class="cpp comments">data. so go back to the main loop. */</code>
</div>
                                                                <div class="line number241 index240 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(</code><code class="cpp functions bold">errno</code> <code class="cpp plain">!= eagain) </code>
</div>
                                                                <div class="line number242 index241 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number243 index242 alt2">
                                                                        <code class="cpp spaces">       </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"read"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number244 index243 alt1">
                                                                        <code class="cpp spaces">       </code><code class="cpp plain">done = 1; </code>
</div>
                                                                <div class="line number245 index244 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number246 index245 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number247 index246 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number248 index247 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code> <code class="cpp plain">(count == 0) </code>
</div>
                                                                <div class="line number249 index248 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number250 index249 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp comments">/* end of file. the remote has closed the </code>
</div>
                                                                <div class="line number251 index250 alt2">
                                                                        <code class="cpp spaces">       </code><code class="cpp comments">connection. */</code>
</div>
                                                                <div class="line number252 index251 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">done = 1; </code>
</div>
                                                                <div class="line number253 index252 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number254 index253 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number255 index254 alt2">
                                                                         </div>
                                                                <div class="line number256 index255 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">/* write the buffer to standard output */</code>
</div>
                                                                <div class="line number257 index256 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">s = write (1, buf, count); </code>
</div>
                                                                <div class="line number258 index257 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s == -1) </code>
</div>
                                                                <div class="line number259 index258 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number260 index259 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"write"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number261 index260 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp functions bold">abort</code> <code class="cpp plain">(); </code>
</div>
                                                                <div class="line number262 index261 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number263 index262 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number264 index263 alt1">
                                                                         </div>
                                                                <div class="line number265 index264 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(done) </code>
</div>
                                                                <div class="line number266 index265 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number267 index266 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp functions bold">printf</code> <code class="cpp plain">(</code><code class="cpp string">"closed connection on descriptor %d\n"</code><code class="cpp plain">, </code>
</div>
                                                                <div class="line number268 index267 alt1">
                                                                        <code class="cpp spaces">       </code><code class="cpp plain">events.data.fd); </code>
</div>
                                                                <div class="line number269 index268 alt2">
                                                                         </div>
                                                                <div class="line number270 index269 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp comments">/* closing the descriptor will make epoll remove it </code>
</div>
                                                                <div class="line number271 index270 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp comments">from the set of descriptors which are monitored. */</code>
</div>
                                                                <div class="line number272 index271 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">close (events.data.fd); </code>
</div>
                                                                <div class="line number273 index272 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number274 index273 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number275 index274 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number276 index275 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number277 index276 alt2">
                                                                         </div>
                                                                <div class="line number278 index277 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">free</code> <code class="cpp plain">(events); </code>
</div>
                                                                <div class="line number279 index278 alt2">
                                                                         </div>
                                                                <div class="line number280 index279 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">close (sfd); </code>
</div>
                                                                <div class="line number281 index280 alt2">
                                                                         </div>
                                                                <div class="line number282 index281 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">exit_success; </code>
</div>
                                                                <div class="line number283 index282 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        代码编译后,./epolltest 8888 ,在另外一个终端中执行<br><code>telnet 192.168.1.161 8888 ,192.168.1.161</code>为执行测试程序的ip。在telnet终端敲入任何字符敲入enter后,会在测试终端显示敲入的字符。</p>
<p class="maodian"></p><h2>
        <span><strong>总结</strong></span>
</h2>
<p>
        以上就是本文关于linux epoll机制详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!</p>
<p>
        原文链接:http://blog.csdn.net/u010657219/article/details/44061629</p>
頁: [1]
查看完整版本: linux epoll机制详解