- 浏览: 13554 次
最新评论
select函数
2011年12月31日
原文:http://www.cnblogs.com/yuallen/archive/2009/12/21/1628946.html
select函数:
系统提供select函数来实现多路复用输入/输出模型。原型:
int select(int maxfd, fd_set *rdset, fd_set *wrset, fd_set *exset, struct timeval *timeout);
参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
FD_ZERO,FD_SET,FD_CLR,FD_ISSET: 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
struct timeval结构:
struct timeval{
long tv_sec;//second
long tv_usec;//minisecond
}
timeout设置情况:
null:select将一直被阻塞,直到某个文件描述符上发生了事件。
0:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生。
特定的时间值:如果在指定的时间段里没有事件发生,select将超时返回。
FD_ZERO,FD_SET,FD_CLR,FD_ISSET:
FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 注意FD_ZERO并不会将发动fd_array[]置0, 而是仅仅将fd_count置为0.
FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。
FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET。
sa_data是14字节协议地址。
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
struct in_addr {
unsigned long s_addr;
};
typedef struct in_addr {
union {
struct{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct {
unsigned short s_w1,
s_w2;
} S_un_w;
unsigned long S_addr;
} S_un;
} IN_ADDR;
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
发表评论
-
meego开发的学习路线
2012-01-20 12:17 596meego开发的学习路线 201 ... -
如何编写PHP扩展
2012-01-20 12:17 750如何编写PHP扩展 2010年0 ... -
Vim Setting
2012-01-20 12:17 1095Vim Setting 2010年12月05日 ... -
转载 gcc一般用法
2012-01-20 12:17 683转载 gcc一般用法 2011年01月13日 生成特定格 ... -
自己动手编写嵌入式Bootloader之(3)
2012-01-20 12:17 636自己动手编写嵌入式Bootloader之(3) 2011年0 ... -
python
2012-01-19 16:59 1294python 2011年10月10日 dive into ... -
Python,简单的力量
2012-01-19 16:59 921Python,简单的力量 2010年 ... -
实例教程:1小时学会Python
2012-01-19 16:59 726实例教程:1小时学会Pytho ... -
python sys
2012-01-19 16:59 705python sys 2011年05月09日 ... -
乡土菜
2012-01-17 06:44 782乡土菜 2011年12月18日 涓 -
vc socket api建立TCP连接(包括域名解析)并收发数据的代码模板
2012-01-16 05:25 1784vc socket api建立TCP连接( ... -
使用NSStream来实现Socket
2012-01-16 05:25 710使用NSStream来实现Socket 2011年03月03 ... -
《ASCE1885的网络编程》---Winsock APIの套接口I/O处理函数
2012-01-16 05:25 1030《ASCE1885的网络编程》---Winsock APIの套 ... -
C# Socket通信三大问题详解
2012-01-16 05:25 1166C# Socket通信三大问题详解 2009年09月20日 ...
相关推荐
linux socket的select函数例子
select函数详解
Select函数实现原理分析Select函数实现原理分析Select函数实现原理分析Select函数实现原理分析
利用select函数在linux环境下实现的一个聊天程序,满足要求: (1)用户默认出于广播模式,一个客户在其客户端发送消息,其他客户端用户全部都可以收到; (2)程序支持下列命令 /help:显示帮助信息 /quit:用户退出...
select函数来实现多路复用输入/输出模型select函数来实现多路复用输入/输出模型
详细的解释了linux下的select函数,对非阻塞IO进行了不错的描述
linux c语言 select函数的用法
利用select函数实现I/O复用,可进行一个服务器与多个客户端的通信。-CSU某课内作业
串口发送接收数据程序,用select函数进行接收
C--网络编程SELECT函数用法详解
关于Select函数的使用,其中便于含有常用的宏,在网络编程中使用到。
之所以称其为“Select模型”,是由于它的“中心思想”便是利用select函数,实现对I/O的管理。最初设计该模型时,主要面向的是某些使用UNIX操作系统的计算机,它们采用的是Berkeley套接字方案。Select模型已集成到...
C网络编程SELECT函数用法详解[整理].pdf
linux 下select的C语言编程技术,对于多路IO口编程有帮助
select系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。
用C写的简单聊天室,分为服务器端和客户端。比较好地展示了socket编程中select这个函数的用法。
嵌入式设备lwip移植中需要用到的相关函数说明,很详细。
主要介绍了Lua select函数用法实例,本文直接给出代码实例,并讲解了select函数的使用技巧,需要的朋友可以参考下
之所以称其为“Select模型”,是由于它的“中心思想”便是利用select函数,实现对I/O的管理。最初设计该模型时,主要面向的是某些使用UNIX操作系统的计算机,它们采用的是Berkeley套接字方案。Select模型已集成到...