人要多读书 發表於 2024-3-19 00:00:00

IO多路复用之epoll全面总结(必看篇)

<p>
        <span><strong>1、基本知识</strong></span></p>
<p>
        epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。</p>
<p>
        <span><strong>2、epoll接口</strong></span></p>
<p>
        epoll操作过程需要三个接口,分别如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_854045">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/epoll.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml plain">int epoll_create(int size);</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="xhtml plain">int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="xhtml plain">int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong>(1) int epoll_create(int size);</strong></span></p>
<p>
        创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。</p>
<p>
        <span><strong>(2)int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);</strong></span></p>
<p>
        epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:</p>
<p>
        epoll_ctl_add:注册新的fd到epfd中;<br>
        epoll_ctl_mod:修改已经注册的fd的监听事件;<br>
        epoll_ctl_del:从epfd中删除一个fd;</p>
<p>
        第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_829348">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">struct epoll_event {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">__uint32_t events; /* epoll events */</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">epoll_data_t data; /* user data variable */</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="xhtml plain">};</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong>events可以是以下几个宏的集合:</strong></span></p>
<p>
        epollin :表示对应的文件描述符可以读(包括对端socket正常关闭);</p>
<p>
        epollout:表示对应的文件描述符可以写;</p>
<p>
        epollpri:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);</p>
<p>
        epollerr:表示对应的文件描述符发生错误;</p>
<p>
        epollhup:表示对应的文件描述符被挂断;</p>
<p>
        epollet: 将epoll设为边缘触发(edge triggered)模式,这是相对于水平触发(level triggered)来说的。</p>
<p>
        epolloneshot:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到epoll队列里</p>
<p>
        <span><strong>(3) int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);</strong></span></p>
<p>
        等待事件的产生,类似于select()调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。</p>
<p>
        <span><strong>3、工作模式</strong></span></p>
<p>
        epoll对文件描述符的操作有两种模式:lt(level trigger)和et(edge trigger)。lt模式是默认模式,lt模式与et模式的区别如下:</p>
<p>
        <span><span><strong>lt模式:</strong></span></span>当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。</p>
<p>
        <span><span><strong>et模式:</strong></span></span>当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。</p>
<p>
        et模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比lt模式高。epoll工作在et模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。</p>
<p>
        <span><strong>4、测试程序</strong></span></p>
<p>
        编写一个服务器回射程序echo,练习epoll过程。</p>
<p>
        服务器代码如下所示:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_94955">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">stdio.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">stdlib.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">string.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">errno.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                         </div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">netinet</code><code class="xhtml plain">/in.h&gt;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/socket.h&gt;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">arpa</code><code class="xhtml plain">/inet.h&gt;</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/epoll.h&gt;</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">unistd.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/types.h&gt;</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                         </div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="xhtml plain">#define ipaddress  "127.0.0.1"</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="xhtml plain">#define port    8787</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="xhtml plain">#define maxsize   1024</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="xhtml plain">#define listenq   5</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="xhtml plain">#define fdsize   1000</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="xhtml plain">#define epollevents 100</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                         </div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="xhtml plain">//函数声明</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="xhtml plain">//创建套接字并进行绑定</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="xhtml plain">static int socket_bind(const char* ip,int port);</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="xhtml plain">//io多路复用epoll</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="xhtml plain">static void do_epoll(int listenfd);</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="xhtml plain">//事件处理函数</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="xhtml plain">static void</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="xhtml plain">handle_events(int epollfd,struct epoll_event *events,int num,int listenfd,char *buf);</code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="xhtml plain">//处理接收到的连接</code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="xhtml plain">static void handle_accpet(int epollfd,int listenfd);</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="xhtml plain">//读处理</code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="xhtml plain">static void do_read(int epollfd,int fd,char *buf);</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="xhtml plain">//写处理</code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="xhtml plain">static void do_write(int epollfd,int fd,char *buf);</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="xhtml plain">//添加事件</code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="xhtml plain">static void add_event(int epollfd,int fd,int state);</code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="xhtml plain">//修改事件</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="xhtml plain">static void modify_event(int epollfd,int fd,int state);</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="xhtml plain">//删除事件</code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="xhtml plain">static void delete_event(int epollfd,int fd,int state);</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                         </div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="xhtml plain">int main(int argc,char *argv[])</code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int listenfd;</code>
</div>
                                                                <div class="line number44 index43 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">listenfd = socket_bind(ipaddress,port);</code>
</div>
                                                                <div class="line number45 index44 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">listen(listenfd,listenq);</code>
</div>
                                                                <div class="line number46 index45 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">do_epoll(listenfd);</code>
</div>
                                                                <div class="line number47 index46 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">return 0;</code>
</div>
                                                                <div class="line number48 index47 alt1">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number49 index48 alt2">
                                                                         </div>
                                                                <div class="line number50 index49 alt1">
                                                                        <code class="xhtml plain">static int socket_bind(const char* ip,int port)</code>
</div>
                                                                <div class="line number51 index50 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number52 index51 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int listenfd;</code>
</div>
                                                                <div class="line number53 index52 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct sockaddr_in servaddr;</code>
</div>
                                                                <div class="line number54 index53 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">listenfd = socket(af_inet,sock_stream,0);</code>
</div>
                                                                <div class="line number55 index54 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">if (listenfd == -1)</code>
</div>
                                                                <div class="line number56 index55 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number57 index56 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">perror("socket error:");</code>
</div>
                                                                <div class="line number58 index57 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">exit(1);</code>
</div>
                                                                <div class="line number59 index58 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number60 index59 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">bzero(&amp;servaddr,sizeof(servaddr));</code>
</div>
                                                                <div class="line number61 index60 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">servaddr.sin_family = af_inet;</code>
</div>
                                                                <div class="line number62 index61 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">inet_pton(af_inet,ip,&amp;servaddr.sin_addr);</code>
</div>
                                                                <div class="line number63 index62 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">servaddr.sin_port = htons(port);</code>
</div>
                                                                <div class="line number64 index63 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">if (bind(listenfd,(struct sockaddr*)&amp;servaddr,sizeof(servaddr)) == -1)</code>
</div>
                                                                <div class="line number65 index64 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number66 index65 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">perror("bind error: ");</code>
</div>
                                                                <div class="line number67 index66 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">exit(1);</code>
</div>
                                                                <div class="line number68 index67 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number69 index68 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">return listenfd;</code>
</div>
                                                                <div class="line number70 index69 alt1">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number71 index70 alt2">
                                                                         </div>
                                                                <div class="line number72 index71 alt1">
                                                                        <code class="xhtml plain">static void do_epoll(int listenfd)</code>
</div>
                                                                <div class="line number73 index72 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number74 index73 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int epollfd;</code>
</div>
                                                                <div class="line number75 index74 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct epoll_event events;</code>
</div>
                                                                <div class="line number76 index75 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int ret;</code>
</div>
                                                                <div class="line number77 index76 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">char buf;</code>
</div>
                                                                <div class="line number78 index77 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">memset(buf,0,maxsize);</code>
</div>
                                                                <div class="line number79 index78 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">//创建一个描述符</code>
</div>
                                                                <div class="line number80 index79 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">epollfd = epoll_create(fdsize);</code>
</div>
                                                                <div class="line number81 index80 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">//添加监听描述符事件</code>
</div>
                                                                <div class="line number82 index81 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">add_event(epollfd,listenfd,epollin);</code>
</div>
                                                                <div class="line number83 index82 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">for ( ; ; )</code>
</div>
                                                                <div class="line number84 index83 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number85 index84 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">//获取已经准备好的描述符事件</code>
</div>
                                                                <div class="line number86 index85 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">ret = epoll_wait(epollfd,events,epollevents,-1);</code>
</div>
                                                                <div class="line number87 index86 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">handle_events(epollfd,events,ret,listenfd,buf);</code>
</div>
                                                                <div class="line number88 index87 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number89 index88 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">close(epollfd);</code>
</div>
                                                                <div class="line number90 index89 alt1">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number91 index90 alt2">
                                                                         </div>
                                                                <div class="line number92 index91 alt1">
                                                                        <code class="xhtml plain">static void</code>
</div>
                                                                <div class="line number93 index92 alt2">
                                                                        <code class="xhtml plain">handle_events(int epollfd,struct epoll_event *events,int num,int listenfd,char *buf)</code>
</div>
                                                                <div class="line number94 index93 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number95 index94 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int i;</code>
</div>
                                                                <div class="line number96 index95 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int fd;</code>
</div>
                                                                <div class="line number97 index96 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">//进行选好遍历</code>
</div>
                                                                <div class="line number98 index97 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">for (i = 0;i &lt; num;i++)</code>
</div>
                                                                <div class="line number99 index98 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number100 index99 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">fd = events.data.fd;</code>
</div>
                                                                <div class="line number101 index100 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">//根据描述符的类型和事件类型进行处理</code>
</div>
                                                                <div class="line number102 index101 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">if ((fd == listenfd) &amp;&amp;(events.events &amp; epollin))</code>
</div>
                                                                <div class="line number103 index102 alt2">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">handle_accpet(epollfd,listenfd);</code>
</div>
                                                                <div class="line number104 index103 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">else if (events.events &amp; epollin)</code>
</div>
                                                                <div class="line number105 index104 alt2">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">do_read(epollfd,fd,buf);</code>
</div>
                                                                <div class="line number106 index105 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">else if (events.events &amp; epollout)</code>
</div>
                                                                <div class="line number107 index106 alt2">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">do_write(epollfd,fd,buf);</code>
</div>
                                                                <div class="line number108 index107 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number109 index108 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number110 index109 alt1">
                                                                        <code class="xhtml plain">static void handle_accpet(int epollfd,int listenfd)</code>
</div>
                                                                <div class="line number111 index110 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number112 index111 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int clifd;</code>
</div>
                                                                <div class="line number113 index112 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct sockaddr_in cliaddr;</code>
</div>
                                                                <div class="line number114 index113 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">socklen_t cliaddrlen;</code>
</div>
                                                                <div class="line number115 index114 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">clifd = accept(listenfd,(struct sockaddr*)&amp;cliaddr,&amp;cliaddrlen);</code>
</div>
                                                                <div class="line number116 index115 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">if (clifd == -1)</code>
</div>
                                                                <div class="line number117 index116 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">perror("accpet error:");</code>
</div>
                                                                <div class="line number118 index117 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">else</code>
</div>
                                                                <div class="line number119 index118 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number120 index119 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">printf("accept a new client: %s:%d\n",inet_ntoa(cliaddr.sin_addr),cliaddr.sin_port);</code>
</div>
                                                                <div class="line number121 index120 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">//添加一个客户描述符和事件</code>
</div>
                                                                <div class="line number122 index121 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">add_event(epollfd,clifd,epollin);</code>
</div>
                                                                <div class="line number123 index122 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number124 index123 alt1">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number125 index124 alt2">
                                                                         </div>
                                                                <div class="line number126 index125 alt1">
                                                                        <code class="xhtml plain">static void do_read(int epollfd,int fd,char *buf)</code>
</div>
                                                                <div class="line number127 index126 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number128 index127 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int nread;</code>
</div>
                                                                <div class="line number129 index128 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">nread = read(fd,buf,maxsize);</code>
</div>
                                                                <div class="line number130 index129 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">if (nread == -1)</code>
</div>
                                                                <div class="line number131 index130 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number132 index131 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">perror("read error:");</code>
</div>
                                                                <div class="line number133 index132 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">close(fd);</code>
</div>
                                                                <div class="line number134 index133 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">delete_event(epollfd,fd,epollin);</code>
</div>
                                                                <div class="line number135 index134 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number136 index135 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">else if (nread == 0)</code>
</div>
                                                                <div class="line number137 index136 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number138 index137 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">fprintf(stderr,"client close.\n");</code>
</div>
                                                                <div class="line number139 index138 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">close(fd);</code>
</div>
                                                                <div class="line number140 index139 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">delete_event(epollfd,fd,epollin);</code>
</div>
                                                                <div class="line number141 index140 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number142 index141 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">else</code>
</div>
                                                                <div class="line number143 index142 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number144 index143 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">printf("read message is : %s",buf);</code>
</div>
                                                                <div class="line number145 index144 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">//修改描述符对应的事件,由读改为写</code>
</div>
                                                                <div class="line number146 index145 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">modify_event(epollfd,fd,epollout);</code>
</div>
                                                                <div class="line number147 index146 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number148 index147 alt1">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number149 index148 alt2">
                                                                         </div>
                                                                <div class="line number150 index149 alt1">
                                                                        <code class="xhtml plain">static void do_write(int epollfd,int fd,char *buf)</code>
</div>
                                                                <div class="line number151 index150 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number152 index151 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int nwrite;</code>
</div>
                                                                <div class="line number153 index152 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">nwrite = write(fd,buf,strlen(buf));</code>
</div>
                                                                <div class="line number154 index153 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">if (nwrite == -1)</code>
</div>
                                                                <div class="line number155 index154 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number156 index155 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">perror("write error:");</code>
</div>
                                                                <div class="line number157 index156 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">close(fd);</code>
</div>
                                                                <div class="line number158 index157 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">delete_event(epollfd,fd,epollout);</code>
</div>
                                                                <div class="line number159 index158 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number160 index159 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">else</code>
</div>
                                                                <div class="line number161 index160 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">modify_event(epollfd,fd,epollin);</code>
</div>
                                                                <div class="line number162 index161 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">memset(buf,0,maxsize);</code>
</div>
                                                                <div class="line number163 index162 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number164 index163 alt1">
                                                                         </div>
                                                                <div class="line number165 index164 alt2">
                                                                        <code class="xhtml plain">static void add_event(int epollfd,int fd,int state)</code>
</div>
                                                                <div class="line number166 index165 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number167 index166 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct epoll_event ev;</code>
</div>
                                                                <div class="line number168 index167 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.events = state;</code>
</div>
                                                                <div class="line number169 index168 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.data.fd = fd;</code>
</div>
                                                                <div class="line number170 index169 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">epoll_ctl(epollfd,epoll_ctl_add,fd,&amp;ev);</code>
</div>
                                                                <div class="line number171 index170 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number172 index171 alt1">
                                                                         </div>
                                                                <div class="line number173 index172 alt2">
                                                                        <code class="xhtml plain">static void delete_event(int epollfd,int fd,int state)</code>
</div>
                                                                <div class="line number174 index173 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number175 index174 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct epoll_event ev;</code>
</div>
                                                                <div class="line number176 index175 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.events = state;</code>
</div>
                                                                <div class="line number177 index176 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.data.fd = fd;</code>
</div>
                                                                <div class="line number178 index177 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">epoll_ctl(epollfd,epoll_ctl_del,fd,&amp;ev);</code>
</div>
                                                                <div class="line number179 index178 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number180 index179 alt1">
                                                                         </div>
                                                                <div class="line number181 index180 alt2">
                                                                        <code class="xhtml plain">static void modify_event(int epollfd,int fd,int state)</code>
</div>
                                                                <div class="line number182 index181 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number183 index182 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct epoll_event ev;</code>
</div>
                                                                <div class="line number184 index183 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.events = state;</code>
</div>
                                                                <div class="line number185 index184 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.data.fd = fd;</code>
</div>
                                                                <div class="line number186 index185 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">epoll_ctl(epollfd,epoll_ctl_mod,fd,&amp;ev);</code>
</div>
                                                                <div class="line number187 index186 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        客户端也用epoll实现,控制stdin_fileno、stdout_fileno、和sockfd三个描述符,程序如下所示:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_423279">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">netinet</code><code class="xhtml plain">/in.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/socket.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">stdio.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">string.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">stdlib.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/epoll.h&gt;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">time.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">unistd.h</code><code class="xhtml plain">&gt;</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/types.h&gt;</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="xhtml plain">#include &lt;</code><code class="xhtml keyword">arpa</code><code class="xhtml plain">/inet.h&gt;</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                         </div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="xhtml plain">#define maxsize   1024</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="xhtml plain">#define ipaddress  "127.0.0.1"</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="xhtml plain">#define serv_port  8787</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="xhtml plain">#define fdsize    1024</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="xhtml plain">#define epollevents 20</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                         </div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="xhtml plain">static void handle_connection(int sockfd);</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="xhtml plain">static void</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="xhtml plain">handle_events(int epollfd,struct epoll_event *events,int num,int sockfd,char *buf);</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="xhtml plain">static void do_read(int epollfd,int fd,int sockfd,char *buf);</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="xhtml plain">static void do_read(int epollfd,int fd,int sockfd,char *buf);</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="xhtml plain">static void do_write(int epollfd,int fd,int sockfd,char *buf);</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="xhtml plain">static void add_event(int epollfd,int fd,int state);</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="xhtml plain">static void delete_event(int epollfd,int fd,int state);</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="xhtml plain">static void modify_event(int epollfd,int fd,int state);</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                         </div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="xhtml plain">int main(int argc,char *argv[])</code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int         sockfd;</code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct sockaddr_in servaddr;</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">sockfd = socket(af_inet,sock_stream,0);</code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">bzero(&amp;servaddr,sizeof(servaddr));</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">servaddr.sin_family = af_inet;</code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">servaddr.sin_port = htons(serv_port);</code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">inet_pton(af_inet,ipaddress,&amp;servaddr.sin_addr);</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">connect(sockfd,(struct sockaddr*)&amp;servaddr,sizeof(servaddr));</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">//处理连接</code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">handle_connection(sockfd);</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">close(sockfd);</code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">return 0;</code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                         </div>
                                                                <div class="line number44 index43 alt1">
                                                                         </div>
                                                                <div class="line number45 index44 alt2">
                                                                        <code class="xhtml plain">static void handle_connection(int sockfd)</code>
</div>
                                                                <div class="line number46 index45 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number47 index46 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int epollfd;</code>
</div>
                                                                <div class="line number48 index47 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct epoll_event events;</code>
</div>
                                                                <div class="line number49 index48 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">char buf;</code>
</div>
                                                                <div class="line number50 index49 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int ret;</code>
</div>
                                                                <div class="line number51 index50 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">epollfd = epoll_create(fdsize);</code>
</div>
                                                                <div class="line number52 index51 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">add_event(epollfd,stdin_fileno,epollin);</code>
</div>
                                                                <div class="line number53 index52 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">for ( ; ; )</code>
</div>
                                                                <div class="line number54 index53 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number55 index54 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">ret = epoll_wait(epollfd,events,epollevents,-1);</code>
</div>
                                                                <div class="line number56 index55 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">handle_events(epollfd,events,ret,sockfd,buf);</code>
</div>
                                                                <div class="line number57 index56 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number58 index57 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">close(epollfd);</code>
</div>
                                                                <div class="line number59 index58 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number60 index59 alt1">
                                                                         </div>
                                                                <div class="line number61 index60 alt2">
                                                                        <code class="xhtml plain">static void</code>
</div>
                                                                <div class="line number62 index61 alt1">
                                                                        <code class="xhtml plain">handle_events(int epollfd,struct epoll_event *events,int num,int sockfd,char *buf)</code>
</div>
                                                                <div class="line number63 index62 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number64 index63 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int fd;</code>
</div>
                                                                <div class="line number65 index64 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int i;</code>
</div>
                                                                <div class="line number66 index65 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">for (i = 0;i &lt; num;i++)</code>
</div>
                                                                <div class="line number67 index66 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number68 index67 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">fd = events.data.fd;</code>
</div>
                                                                <div class="line number69 index68 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">if (events.events &amp; epollin)</code>
</div>
                                                                <div class="line number70 index69 alt1">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">do_read(epollfd,fd,sockfd,buf);</code>
</div>
                                                                <div class="line number71 index70 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">else if (events.events &amp; epollout)</code>
</div>
                                                                <div class="line number72 index71 alt1">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">do_write(epollfd,fd,sockfd,buf);</code>
</div>
                                                                <div class="line number73 index72 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number74 index73 alt1">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number75 index74 alt2">
                                                                         </div>
                                                                <div class="line number76 index75 alt1">
                                                                        <code class="xhtml plain">static void do_read(int epollfd,int fd,int sockfd,char *buf)</code>
</div>
                                                                <div class="line number77 index76 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number78 index77 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int nread;</code>
</div>
                                                                <div class="line number79 index78 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">nread = read(fd,buf,maxsize);</code>
</div>
                                                                <div class="line number80 index79 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">if (nread == -1)</code>
</div>
                                                                <div class="line number81 index80 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number82 index81 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">perror("read error:");</code>
</div>
                                                                <div class="line number83 index82 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">close(fd);</code>
</div>
                                                                <div class="line number84 index83 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number85 index84 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">else if (nread == 0)</code>
</div>
                                                                <div class="line number86 index85 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number87 index86 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">fprintf(stderr,"server close.\n");</code>
</div>
                                                                <div class="line number88 index87 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">close(fd);</code>
</div>
                                                                <div class="line number89 index88 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number90 index89 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">else</code>
</div>
                                                                <div class="line number91 index90 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number92 index91 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">if (fd == stdin_fileno)</code>
</div>
                                                                <div class="line number93 index92 alt2">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">add_event(epollfd,sockfd,epollout);</code>
</div>
                                                                <div class="line number94 index93 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">else</code>
</div>
                                                                <div class="line number95 index94 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number96 index95 alt1">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">delete_event(epollfd,sockfd,epollin);</code>
</div>
                                                                <div class="line number97 index96 alt2">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">add_event(epollfd,stdout_fileno,epollout);</code>
</div>
                                                                <div class="line number98 index97 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number99 index98 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number100 index99 alt1">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number101 index100 alt2">
                                                                         </div>
                                                                <div class="line number102 index101 alt1">
                                                                        <code class="xhtml plain">static void do_write(int epollfd,int fd,int sockfd,char *buf)</code>
</div>
                                                                <div class="line number103 index102 alt2">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number104 index103 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">int nwrite;</code>
</div>
                                                                <div class="line number105 index104 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">nwrite = write(fd,buf,strlen(buf));</code>
</div>
                                                                <div class="line number106 index105 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">if (nwrite == -1)</code>
</div>
                                                                <div class="line number107 index106 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number108 index107 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">perror("write error:");</code>
</div>
                                                                <div class="line number109 index108 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">close(fd);</code>
</div>
                                                                <div class="line number110 index109 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number111 index110 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">else</code>
</div>
                                                                <div class="line number112 index111 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number113 index112 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">if (fd == stdout_fileno)</code>
</div>
                                                                <div class="line number114 index113 alt1">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">delete_event(epollfd,fd,epollout);</code>
</div>
                                                                <div class="line number115 index114 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">else</code>
</div>
                                                                <div class="line number116 index115 alt1">
                                                                        <code class="xhtml spaces">      </code><code class="xhtml plain">modify_event(epollfd,fd,epollin);</code>
</div>
                                                                <div class="line number117 index116 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number118 index117 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">memset(buf,0,maxsize);</code>
</div>
                                                                <div class="line number119 index118 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number120 index119 alt1">
                                                                         </div>
                                                                <div class="line number121 index120 alt2">
                                                                        <code class="xhtml plain">static void add_event(int epollfd,int fd,int state)</code>
</div>
                                                                <div class="line number122 index121 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number123 index122 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct epoll_event ev;</code>
</div>
                                                                <div class="line number124 index123 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.events = state;</code>
</div>
                                                                <div class="line number125 index124 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.data.fd = fd;</code>
</div>
                                                                <div class="line number126 index125 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">epoll_ctl(epollfd,epoll_ctl_add,fd,&amp;ev);</code>
</div>
                                                                <div class="line number127 index126 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number128 index127 alt1">
                                                                         </div>
                                                                <div class="line number129 index128 alt2">
                                                                        <code class="xhtml plain">static void delete_event(int epollfd,int fd,int state)</code>
</div>
                                                                <div class="line number130 index129 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number131 index130 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct epoll_event ev;</code>
</div>
                                                                <div class="line number132 index131 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.events = state;</code>
</div>
                                                                <div class="line number133 index132 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.data.fd = fd;</code>
</div>
                                                                <div class="line number134 index133 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">epoll_ctl(epollfd,epoll_ctl_del,fd,&amp;ev);</code>
</div>
                                                                <div class="line number135 index134 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number136 index135 alt1">
                                                                         </div>
                                                                <div class="line number137 index136 alt2">
                                                                        <code class="xhtml plain">static void modify_event(int epollfd,int fd,int state)</code>
</div>
                                                                <div class="line number138 index137 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number139 index138 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">struct epoll_event ev;</code>
</div>
                                                                <div class="line number140 index139 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.events = state;</code>
</div>
                                                                <div class="line number141 index140 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">ev.data.fd = fd;</code>
</div>
                                                                <div class="line number142 index141 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">epoll_ctl(epollfd,epoll_ctl_mod,fd,&amp;ev);</code>
</div>
                                                                <div class="line number143 index142 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong>5、测试结果</strong></p>
<p>
        <img title="IO多路复用之epoll全面总结(必看篇)" alt="IO多路复用之epoll全面总结(必看篇)" src="https://zhuji.jb51.net/uploads/img/202305/99bcbff36e13ffcb236d12ac0827f80c.jpg"></p>
<p>
        <img title="IO多路复用之epoll全面总结(必看篇)" alt="IO多路复用之epoll全面总结(必看篇)" src="https://zhuji.jb51.net/uploads/img/202305/c247a52f92aae322b1ede132b74b3b0c.jpg"></p>
<p>
        <img title="IO多路复用之epoll全面总结(必看篇)" alt="IO多路复用之epoll全面总结(必看篇)" src="https://zhuji.jb51.net/uploads/img/202305/f2b3eea8b1f640b4d9cd6d3b86c2262c.jpg"></p>
<p>
        以上就是小编为大家带来的io多路复用之epoll全面总结(必看篇)全部内容了,希望大家多多支持~</p>
頁: [1]
查看完整版本: IO多路复用之epoll全面总结(必看篇)