IO多路复用之poll全面总结(必看篇)
<p><span><strong>1、基本知识</strong></span></p>
<p>
poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。</p>
<p>
<span><strong>2、poll函数</strong></span></p>
<p>
<span><strong>函数格式如下所示:</strong></span></p>
<p>
# include <poll.h><br>
int poll ( struct pollfd * fds, unsigned int nfds, int timeout);</p>
<p>
<span><strong>pollfd结构体定义如下:</strong></span></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_529058">
<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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">struct pollfd {</code>
</div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">int fd; /* 文件描述符 */</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">short events; /* 等待的事件 */</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml plain">short revents; /* 实际发生了的事件 */</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">} ; </code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
</p>
<p>
每一个pollfd结构体指定了一个被监视的文件描述符,可以传递多个结构体,指示poll()监视多个文件描述符。每个结构体的events域是监视该文件描述符的事件掩码,由用户来设置这个域。revents域是文件描述符的操作结果事件掩码,内核在调用返回时设置这个域。events域中请求的任何事件都可能在revents域中返回。合法的事件如下:</p>
<p>
pollin 有数据可读。</p>
<p>
pollrdnorm 有普通数据可读。</p>
<p>
pollrdband 有优先数据可读。</p>
<p>
pollpri 有紧迫数据可读。</p>
<p>
pollout 写数据不会导致阻塞。</p>
<p>
pollwrnorm 写普通数据不会导致阻塞。</p>
<p>
pollwrband 写优先数据不会导致阻塞。</p>
<p>
pollmsgsigpoll 消息可用。</p>
<p>
此外,revents域中还可能返回下列事件:</p>
<p>
poller 指定的文件描述符发生错误。</p>
<p>
pollhup 指定的文件描述符挂起事件。</p>
<p>
pollnval指定的文件描述符非法。</p>
<p>
这些事件在events域中无意义,因为它们在合适的时候总是会从revents中返回。</p>
<p>
<span><strong>使用poll()和select()不一样,你不需要显式地请求异常情况报告。</strong></span></p>
<p>
pollin | pollpri等价于select()的读事件,pollout |pollwrband等价于select()的写事件。pollin等价于pollrdnorm |pollrdband,而pollout则等价于pollwrnorm。例如,要同时监视一个文件描述符是否可读和可写,我们可以设置 events为pollin |pollout。在poll返回时,我们可以检查revents中的标志,对应于文件描述符请求的events结构体。如果pollin事件被设置,则文件描述符可以被读取而不阻塞。如果pollout被设置,则文件描述符可以写入而不导致阻塞。这些标志并不是互斥的:它们可能被同时设置,表示这个文件描述符的读取和写入操作都会正常返回而不阻塞。</p>
<p>
timeout参数指定等待的毫秒数,无论i/o是否准备好,poll都会返回。timeout指定为负数值表示无限超时,使poll()一直挂起直到一个指定事件发生;timeout为0指示poll调用立即返回并列出准备好i/o的文件描述符,但并不等待其它的事件。这种情况下,poll()就像它的名字那样,一旦选举出来,立即返回。</p>
<p>
<strong>返回值和错误代码</strong></p>
<p>
成功时,poll()返回结构体中revents域不为0的文件描述符个数;如果在超时前没有任何事件发生,poll()返回0;失败时,poll()返回-1,并设置errno为下列值之一:<br>
ebadf 一个或多个结构体中指定的文件描述符无效。</p>
<p>
efaultfds 指针指向的地址超出进程的地址空间。</p>
<p>
eintr 请求的事件之前产生一个信号,调用可以重新发起。</p>
<p>
einvalnfds参数超出plimit_nofile值。</p>
<p>
enomem 可用内存不足,无法完成请求。</p>
<p>
<span><strong>3、测出程序</strong></span></p>
<p>
编写一个echo server程序,功能是客户端向服务器发送信息,服务器接收输出并原样发送回给客户端,客户端接收到输出到终端。</p>
<p>
服务器端程序如下:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_387886">
<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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">stdio.h</code><code class="xhtml plain">></code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">stdlib.h</code><code class="xhtml plain">></code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">string.h</code><code class="xhtml plain">></code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">errno.h</code><code class="xhtml plain">></code>
</div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">netinet</code><code class="xhtml plain">/in.h></code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/socket.h></code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">poll.h</code><code class="xhtml plain">></code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">unistd.h</code><code class="xhtml plain">></code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/types.h></code>
</div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
<code class="xhtml plain">#define ipaddress "127.0.0.1"</code>
</div>
<div class="line number13 index12 alt2">
<code class="xhtml plain">#define port 8787</code>
</div>
<div class="line number14 index13 alt1">
<code class="xhtml plain">#define maxline 1024</code>
</div>
<div class="line number15 index14 alt2">
<code class="xhtml plain">#define listenq 5</code>
</div>
<div class="line number16 index15 alt1">
<code class="xhtml plain">#define open_max 1000</code>
</div>
<div class="line number17 index16 alt2">
<code class="xhtml plain">#define inftim -1</code>
</div>
<div class="line number18 index17 alt1">
</div>
<div class="line number19 index18 alt2">
<code class="xhtml plain">//函数声明</code>
</div>
<div class="line number20 index19 alt1">
<code class="xhtml plain">//创建套接字并进行绑定</code>
</div>
<div class="line number21 index20 alt2">
<code class="xhtml plain">static int socket_bind(const char* ip,int port);</code>
</div>
<div class="line number22 index21 alt1">
<code class="xhtml plain">//io多路复用poll</code>
</div>
<div class="line number23 index22 alt2">
<code class="xhtml plain">static void do_poll(int listenfd);</code>
</div>
<div class="line number24 index23 alt1">
<code class="xhtml plain">//处理多个连接</code>
</div>
<div class="line number25 index24 alt2">
<code class="xhtml plain">static void handle_connection(struct pollfd *connfds,int num);</code>
</div>
<div class="line number26 index25 alt1">
</div>
<div class="line number27 index26 alt2">
<code class="xhtml plain">int main(int argc,char *argv[])</code>
</div>
<div class="line number28 index27 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number29 index28 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int listenfd,connfd,sockfd;</code>
</div>
<div class="line number30 index29 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">struct sockaddr_in cliaddr;</code>
</div>
<div class="line number31 index30 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">socklen_t cliaddrlen;</code>
</div>
<div class="line number32 index31 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">listenfd = socket_bind(ipaddress,port);</code>
</div>
<div class="line number33 index32 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">listen(listenfd,listenq);</code>
</div>
<div class="line number34 index33 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">do_poll(listenfd);</code>
</div>
<div class="line number35 index34 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">return 0;</code>
</div>
<div class="line number36 index35 alt1">
<code class="xhtml plain">}</code>
</div>
<div class="line number37 index36 alt2">
</div>
<div class="line number38 index37 alt1">
<code class="xhtml plain">static int socket_bind(const char* ip,int port)</code>
</div>
<div class="line number39 index38 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number40 index39 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int listenfd;</code>
</div>
<div class="line number41 index40 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">struct sockaddr_in servaddr;</code>
</div>
<div class="line number42 index41 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">listenfd = socket(af_inet,sock_stream,0);</code>
</div>
<div class="line number43 index42 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (listenfd == -1)</code>
</div>
<div class="line number44 index43 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number45 index44 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">perror("socket error:");</code>
</div>
<div class="line number46 index45 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">exit(1);</code>
</div>
<div class="line number47 index46 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number48 index47 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">bzero(&servaddr,sizeof(servaddr));</code>
</div>
<div class="line number49 index48 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">servaddr.sin_family = af_inet;</code>
</div>
<div class="line number50 index49 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">inet_pton(af_inet,ip,&servaddr.sin_addr);</code>
</div>
<div class="line number51 index50 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">servaddr.sin_port = htons(port);</code>
</div>
<div class="line number52 index51 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1)</code>
</div>
<div class="line number53 index52 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number54 index53 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">perror("bind error: ");</code>
</div>
<div class="line number55 index54 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">exit(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">return listenfd;</code>
</div>
<div class="line number58 index57 alt1">
<code class="xhtml plain">}</code>
</div>
<div class="line number59 index58 alt2">
</div>
<div class="line number60 index59 alt1">
<code class="xhtml plain">static void do_poll(int listenfd)</code>
</div>
<div class="line number61 index60 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number62 index61 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int connfd,sockfd;</code>
</div>
<div class="line number63 index62 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">struct sockaddr_in cliaddr;</code>
</div>
<div class="line number64 index63 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">socklen_t cliaddrlen;</code>
</div>
<div class="line number65 index64 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">struct pollfd clientfds;</code>
</div>
<div class="line number66 index65 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int maxi;</code>
</div>
<div class="line number67 index66 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int i;</code>
</div>
<div class="line number68 index67 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int nready;</code>
</div>
<div class="line number69 index68 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">//添加监听描述符</code>
</div>
<div class="line number70 index69 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">clientfds.fd = listenfd;</code>
</div>
<div class="line number71 index70 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">clientfds.events = pollin;</code>
</div>
<div class="line number72 index71 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//初始化客户连接描述符</code>
</div>
<div class="line number73 index72 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">for (i = 1;i < </code><code class="xhtml keyword">open_max</code><code class="xhtml plain">;i++)</code>
</div>
<div class="line number74 index73 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">clientfds.fd = -1;</code>
</div>
<div class="line number75 index74 alt2">
<code class="xhtml spaces"> </code><code class="xhtml color1">maxi</code> <code class="xhtml plain">= </code><code class="xhtml string">0</code><code class="xhtml plain">;</code>
</div>
<div class="line number76 index75 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//循环处理</code>
</div>
<div class="line number77 index76 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">for ( ; ; )</code>
</div>
<div class="line number78 index77 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</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 color1">nready</code> <code class="xhtml plain">= </code><code class="xhtml string">poll</code><code class="xhtml plain">(clientfds,maxi+1,inftim);</code>
</div>
<div class="line number81 index80 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (nready == -1)</code>
</div>
<div class="line number82 index81 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number83 index82 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">perror("poll error:");</code>
</div>
<div class="line number84 index83 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">exit(1);</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">//测试监听描述符是否准备好</code>
</div>
<div class="line number87 index86 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (clientfds.revents & pollin)</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 color1">cliaddrlen</code> <code class="xhtml plain">= </code><code class="xhtml string">sizeof</code><code class="xhtml plain">(cliaddr);</code>
</div>
<div class="line number90 index89 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//接受新的连接</code>
</div>
<div class="line number91 index90 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if ((</code><code class="xhtml color1">connfd</code> <code class="xhtml plain">= </code><code class="xhtml string">accept</code><code class="xhtml plain">(listenfd,(struct sockaddr*)&cliaddr,&cliaddrlen)) == -1)</code>
</div>
<div class="line number92 index91 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number93 index92 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (errno == eintr)</code>
</div>
<div class="line number94 index93 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">continue;</code>
</div>
<div class="line number95 index94 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">else</code>
</div>
<div class="line number96 index95 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number97 index96 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">perror("accept error:");</code>
</div>
<div class="line number98 index97 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">exit(1);</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">}</code>
</div>
<div class="line number101 index100 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">fprintf(stdout,"accept a new client: %s:%d\n", inet_ntoa(cliaddr.sin_addr),cliaddr.sin_port);</code>
</div>
<div class="line number102 index101 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//将新的连接描述符添加到数组中</code>
</div>
<div class="line number103 index102 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">for (</code><code class="xhtml color1">i</code> <code class="xhtml plain">= </code><code class="xhtml string">1</code><code class="xhtml plain">;i < open_max;i++)</code>
</div>
<div class="line number104 index103 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number105 index104 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (clientfds.fd < 0)</code>
</div>
<div class="line number106 index105 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number107 index106 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">clientfds</code><code class="xhtml color1">.fd</code> <code class="xhtml plain">= </code><code class="xhtml string">connfd</code><code class="xhtml plain">;</code>
</div>
<div class="line number108 index107 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">break;</code>
</div>
<div class="line number109 index108 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</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">if (i == open_max)</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">fprintf(stderr,"too many clients.\n");</code>
</div>
<div class="line number114 index113 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">exit(1);</code>
</div>
<div class="line number115 index114 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number116 index115 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//将新的描述符添加到读描述符集合中</code>
</div>
<div class="line number117 index116 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">clientfds</code><code class="xhtml color1">.events</code> <code class="xhtml plain">= </code><code class="xhtml string">pollin</code><code class="xhtml plain">;</code>
</div>
<div class="line number118 index117 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//记录客户连接套接字的个数</code>
</div>
<div class="line number119 index118 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">maxi = (i > maxi ? i : maxi);</code>
</div>
<div class="line number120 index119 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (--nready <= 0)</code>
</div>
<div class="line number121 index120 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">continue;</code>
</div>
<div class="line number122 index121 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</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 spaces"> </code><code class="xhtml plain">handle_connection(clientfds,maxi);</code>
</div>
<div class="line number125 index124 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number126 index125 alt1">
<code class="xhtml plain">}</code>
</div>
<div class="line number127 index126 alt2">
</div>
<div class="line number128 index127 alt1">
<code class="xhtml plain">static void handle_connection(struct pollfd *connfds,int num)</code>
</div>
<div class="line number129 index128 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number130 index129 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int i,n;</code>
</div>
<div class="line number131 index130 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">char buf;</code>
</div>
<div class="line number132 index131 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">memset(buf,0,maxline);</code>
</div>
<div class="line number133 index132 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">for (i = 1;i <= num;i++)</code>
</div>
<div class="line number134 index133 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number135 index134 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (connfds.fd < 0)</code>
</div>
<div class="line number136 index135 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">continue;</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">if (connfds.revents & pollin)</code>
</div>
<div class="line number139 index138 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number140 index139 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//接收客户端发送的信息</code>
</div>
<div class="line number141 index140 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">n = read(connfds.fd,buf,maxline);</code>
</div>
<div class="line number142 index141 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (n == 0)</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">close(connfds.fd);</code>
</div>
<div class="line number145 index144 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">connfds.fd = -1;</code>
</div>
<div class="line number146 index145 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">continue;</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 spaces"> </code><code class="xhtml plain">// printf("read msg is: ");</code>
</div>
<div class="line number149 index148 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">write(stdout_fileno,buf,n);</code>
</div>
<div class="line number150 index149 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//向客户端发送buf</code>
</div>
<div class="line number151 index150 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">write(connfds.fd,buf,n);</code>
</div>
<div class="line number152 index151 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number153 index152 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number154 index153 alt1">
<code class="xhtml plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
客户端代码如下所示:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_241772">
<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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">netinet</code><code class="xhtml plain">/in.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/socket.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">stdio.h</code><code class="xhtml plain">></code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">string.h</code><code class="xhtml plain">></code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">stdlib.h</code><code class="xhtml plain">></code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">poll.h</code><code class="xhtml plain">></code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">time.h</code><code class="xhtml plain">></code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">unistd.h</code><code class="xhtml plain">></code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">sys</code><code class="xhtml plain">/types.h></code>
</div>
<div class="line number10 index9 alt1">
</div>
<div class="line number11 index10 alt2">
<code class="xhtml plain">#define maxline 1024</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml plain">#define ipaddress "127.0.0.1"</code>
</div>
<div class="line number13 index12 alt2">
<code class="xhtml plain">#define serv_port 8787</code>
</div>
<div class="line number14 index13 alt1">
</div>
<div class="line number15 index14 alt2">
<code class="xhtml plain">#define max(a,b) (a > b) ? a : b</code>
</div>
<div class="line number16 index15 alt1">
</div>
<div class="line number17 index16 alt2">
<code class="xhtml plain">static void handle_connection(int sockfd);</code>
</div>
<div class="line number18 index17 alt1">
</div>
<div class="line number19 index18 alt2">
<code class="xhtml plain">int main(int argc,char *argv[])</code>
</div>
<div class="line number20 index19 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number21 index20 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int sockfd;</code>
</div>
<div class="line number22 index21 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">struct sockaddr_in servaddr;</code>
</div>
<div class="line number23 index22 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">sockfd = socket(af_inet,sock_stream,0);</code>
</div>
<div class="line number24 index23 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">bzero(&servaddr,sizeof(servaddr));</code>
</div>
<div class="line number25 index24 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">servaddr.sin_family = af_inet;</code>
</div>
<div class="line number26 index25 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">servaddr.sin_port = htons(serv_port);</code>
</div>
<div class="line number27 index26 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">inet_pton(af_inet,ipaddress,&servaddr.sin_addr);</code>
</div>
<div class="line number28 index27 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));</code>
</div>
<div class="line number29 index28 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">//处理连接描述符</code>
</div>
<div class="line number30 index29 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">handle_connection(sockfd);</code>
</div>
<div class="line number31 index30 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">return 0;</code>
</div>
<div class="line number32 index31 alt1">
<code class="xhtml plain">}</code>
</div>
<div class="line number33 index32 alt2">
</div>
<div class="line number34 index33 alt1">
<code class="xhtml plain">static void handle_connection(int sockfd)</code>
</div>
<div class="line number35 index34 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number36 index35 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">char sendline,recvline;</code>
</div>
<div class="line number37 index36 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int maxfdp,stdineof;</code>
</div>
<div class="line number38 index37 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">struct pollfd pfds;</code>
</div>
<div class="line number39 index38 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int n;</code>
</div>
<div class="line number40 index39 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">//添加连接描述符</code>
</div>
<div class="line number41 index40 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">pfds.fd = sockfd;</code>
</div>
<div class="line number42 index41 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">pfds.events = pollin;</code>
</div>
<div class="line number43 index42 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">//添加标准输入描述符</code>
</div>
<div class="line number44 index43 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">pfds.fd = stdin_fileno;</code>
</div>
<div class="line number45 index44 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">pfds.events = pollin;</code>
</div>
<div class="line number46 index45 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">for (; ;)</code>
</div>
<div class="line number47 index46 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number48 index47 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">poll(pfds,2,-1);</code>
</div>
<div class="line number49 index48 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (pfds.revents & pollin)</code>
</div>
<div class="line number50 index49 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number51 index50 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">n = read(sockfd,recvline,maxline);</code>
</div>
<div class="line number52 index51 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (n == 0)</code>
</div>
<div class="line number53 index52 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number54 index53 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">fprintf(stderr,"client: server is closed.\n");</code>
</div>
<div class="line number55 index54 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">close(sockfd);</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">write(stdout_fileno,recvline,n);</code>
</div>
<div class="line number58 index57 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</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">if (pfds.revents & pollin)</code>
</div>
<div class="line number61 index60 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number62 index61 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">n = read(stdin_fileno,sendline,maxline);</code>
</div>
<div class="line number63 index62 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (n == 0)</code>
</div>
<div class="line number64 index63 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number65 index64 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">shutdown(sockfd,shut_wr);</code>
</div>
<div class="line number66 index65 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">continue;</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">write(sockfd,sendline,n);</code>
</div>
<div class="line number69 index68 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number70 index69 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number71 index70 alt2">
<code class="xhtml plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<span><strong>4、程序测试结果</strong></span></p>
<p>
<img title="IO多路复用之poll全面总结(必看篇)" alt="IO多路复用之poll全面总结(必看篇)" src="https://zhuji.jb51.net/uploads/img/202305/f12623d836ab82d74b012746dd15aadc.jpg"></p>
<p>
<img title="IO多路复用之poll全面总结(必看篇)" alt="IO多路复用之poll全面总结(必看篇)" src="https://zhuji.jb51.net/uploads/img/202305/3e824a457ffe73778c5c6dea40ecc189.jpg"></p>
<p>
<img title="IO多路复用之poll全面总结(必看篇)" alt="IO多路复用之poll全面总结(必看篇)" src="https://zhuji.jb51.net/uploads/img/202305/26c9ed783e3e7b314aa187f118050fa1.jpg"></p>
<p>
以上就是小编为大家带来的io多路复用之poll全面总结(必看篇)全部内容了,希望大家多多支持~</p>
頁:
[1]