代码如下:
#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;
新闻热点
疑难解答