首页 > 开发 > PowerShell > 正文

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

2020-05-30 20:10:39
字体:
来源:转载
供稿:网友

代码如下:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sysexits.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#ifdef __ENABLED_DEBUG_INFO_OUTPUT__
    #define DEBUG_OUTPUT(format) printf( "/nFile: %s : Line: %d ->Function: %s/n"format"/n", __BASE_FILE__, __LINE__, __FUNCTION__ )
    #define DEBUG_OUTPUT_PARA(format,...) printf( "/nFile: %s : Line: %d ->Function: %s/n"format"/n", __BASE_FILE__, __LINE__, __FUNCTION__, __VA_ARGS__ )
#else
    #define DEBUG_OUTPUT(format)
    #define DEBUG_OUTPUT_PARA(format,...)
#endif

// @brief 非阻塞等待套接字是否可读/写
// @param[in] sockfd 套接字描述符
// @param[in] bWhichSet true - 可读集; false - 可写集;
// @param[in] uiTimeOutMS 超时时长(单位:微秒);
// @pre scokfd 有效套接字描述符,即大于等于零(>=0)
// @return 此函数执行结果
// @return  0 - 可以读/写;
//         -1 - 参数不合法;
//         -2 - 检测已超时;
// @note uiTimeOutMS 超时时长,设为零(0),则不等待超时
static inline int
wait_rw_able( int          sockfd,
              bool         bWhichSet,
              unsigned int uiTimeOutMS )
{
    // 默认为检测已超时
    int iReturnValue = -2;

    // 可读描述符集
    fd_set rset;
    // 可写描述符集
    fd_set wset;

    // select 将等待的时间
    timeval tv;

    do // 非循环,只是为了保证函数只有一个返回点
    {
        // 参数不合法
        if ( 0 > sockfd )
        {
            iReturnValue = -1;
            break;
        }

        // 注:每次调用 select 之前都要重设一次!
        tv.tv_sec  = 0;
        tv.tv_usec = uiTimeOutMS;

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表