转载自:
http://www.cnblogs.com/scope-beyound/p/3628217.html
http://www.cnblogs.com/moonvan/archive/2012/05/26/2518881.html
//仅供学习,如有冒犯,请留言删帖
1.seclect函数
==>经常用到selec系统调用来判断套接字上是否存在数据可读,或者能否向一个套接字写入数据
返回值:
如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
/*用法*/
retval = select(ss + 1, &rfds, NULL, NULL, &tv);
//第一个参数是指集合中文件描述符的范围,固定格式:文件描述符+1
//什么是集合中文件描述符的范围?接下来介绍两个结构体
//二三四参数是集合struct fd_set结构体类型
//最后一个是超时时间
2.结构体timeval和fd_set
#include "sys/time.h"
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
//用法
struct timeval start,end;
float consumed=0;
gettimeofday(&start,NULL);
gettimeofday(&end,NULL);
consumed = end.tv_sec-start.tv_sec +(end.tv_usec-start.tv_usec)/1000000;//以秒为单位
//1s居然等于10的6次方微秒
定义如下:
#define __NFDBITS (8 * sizeof(unsigned long)) //每个ulong型可以表示多少个bit,
#define __FD_SETSIZE 1024 //socket最大取值为1024
#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS) //bitmap一共有1024个bit,共需要多少个ulong
typedef struct {
unsigned long fds_bits [__FDSET_LONGS]; //用ulong数组来表示bitmap
} __kernel_fd_set;
typedef __kernel_fd_set fd_set;
对应操作:
//每个ulong为32位,可以表示32个bit。
//fd >> 5 即 fd / 32,找到对应的ulong下标i;fd & 31 即fd % 32,找到在ulong[i]内部的位置
#define __FD_SET(fd, fdsetp) (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] |= (1<<((fd) & 31))) //设置对应的bit
#define __FD_CLR(fd, fdsetp) (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] &= ~(1<<((fd) & 31))) //清除对应的bit
#define __FD_ISSET(fd, fdsetp) ((((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] & (1<<((fd) & 31))) != 0) //判断对应的bit是否为1
#define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof (*(fd_set *)(fdsetp)))) //memset bitmap
举例:
FD_CLR( s, *set) //从set中删除句柄s;
FD_ISSET( s, *set) //检查句柄s是否存在与set中;
FD_SET( s, *set ) //把句柄s添加到set中;
FD_ZERO( *set ) //把set队列初始为空.