linux下非阻塞模式网络通讯模型示例分享

论坛 期权论坛     
niminba   2021-5-22 16:19   49   0
<p></p><div class="codetitle"><span><a class="copybut" data="20496" id="copybut20496"><u>复制代码</u></a></span> 代码如下:</div><div class="codebody" id="code20496"><br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br>#include &lt;unistd.h&gt;<br>#include &lt;errno.h&gt;<br>#include &lt;unistd.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;sysexits.h&gt;<br>#include &lt;time.h&gt;<br>#include &lt;sys/time.h&gt;<br>#include &lt;sys/types.h&gt;<br>#include &lt;sys/uio.h&gt;<br>#include &lt;sys/ioctl.h&gt;<br>#include &lt;sys/types.h&gt;<br>#include &lt;sys/socket.h&gt;<br>#include &lt;net/if.h&gt;<br>#include &lt;netinet/in.h&gt;<br>#include &lt;arpa/inet.h&gt;
<p>#ifdef __ENABLED_DEBUG_INFO_OUTPUT__<br>&nbsp;&nbsp;&nbsp; #define DEBUG_OUTPUT(format) printf( "\nFile: %s : Line: %d -&gt;Function: %s\n"format"\n", __BASE_FILE__, __LINE__, __FUNCTION__ )<br>&nbsp;&nbsp;&nbsp; #define DEBUG_OUTPUT_PARA(format,...) printf( "\nFile: %s : Line: %d -&gt;Function: %s\n"format"\n", __BASE_FILE__, __LINE__, __FUNCTION__, __VA_ARGS__ )<br>#else<br>&nbsp;&nbsp;&nbsp; #define DEBUG_OUTPUT(format)<br>&nbsp;&nbsp;&nbsp; #define DEBUG_OUTPUT_PARA(format,...)<br>#endif</p>
<p>// @brief 非阻塞等待套接字是否可读/写<br>// @param[in] sockfd 套接字描述符<br>// @param[in] bWhichSet true - 可读集; false - 可写集;<br>// @param[in] uiTimeOutMS 超时时长(单位:微秒);<br>// @pre scokfd 有效套接字描述符,即大于等于零(&gt;=0)<br>// @return 此函数执行结果<br>// @return&nbsp; 0 - 可以读/写;<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 - 参数不合法;<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -2 - 检测已超时;<br>// @note uiTimeOutMS 超时时长,设为零(0),则不等待超时<br>static inline int<br>wait_rw_able( int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sockfd,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bWhichSet,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int uiTimeOutMS )<br>{<br>&nbsp;&nbsp;&nbsp; // 默认为检测已超时<br>&nbsp;&nbsp;&nbsp; int iReturnValue = -2;</p>
<p>&nbsp;&nbsp;&nbsp; // 可读描述符集<br>&nbsp;&nbsp;&nbsp; fd_set rset;<br>&nbsp;&nbsp;&nbsp; // 可写描述符集<br>&nbsp;&nbsp;&nbsp; fd_set wset;</p>
<p>&nbsp;&nbsp;&nbsp; // select 将等待的时间<br>&nbsp;&nbsp;&nbsp; timeval tv;</p>
<p>&nbsp;&nbsp;&nbsp; do // 非循环,只是为了保证函数只有一个返回点<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 参数不合法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( 0 &gt; sockfd )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iReturnValue = -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 注:每次调用 select 之前都要重设一次!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tv.tv_sec&nbsp; = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tv.tv_usec = uiTimeOutMS;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 检测是否可读<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( true == bWhichSet )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 清除其所有位<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FD_ZERO( &amp;rset );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置关心的描述符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FD_SET( sockfd, &amp;rset );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 大于零(0) - 有套接字可读,零(0) - 没有,负数 - 出错<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( 0 &lt; select( sockfd + 1, // 从描述符零(0)开始搜索,故此要对套接字描述符加壹(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;rset,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 可读描述符集<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 可写描述符集<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 异常描述符集<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;tv ) )&nbsp;&nbsp;&nbsp;&nbsp; // 等待时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 可读描述符是我们的套接字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( FD_ISSET( sockfd, &amp;rset ) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP