SELECT 入门详解

原创 2012年03月30日 10:41:05

        在winsock的编程中,winsock有许多阻塞函数。比如:accept,recv等。线程执行到这个函数时就会挂起,等条件满足时再继续执行。比如,服务器端accept,只有当客户端执行connect时,才会接着往下执行。而使用select模型,进行通信,可以避免线程挂起,减少资源消耗。select模型,使用范围很广,通常用作网络通讯的客户端,或者连接数较小的服务端,如局域网游戏。

        select模型要用的结构和函数如下:

        fd_set,可以理解为文件句柄的一个集合,sock也可认为是一个文件句柄。

        timeval,用来表示时间,结构体中的tv_sec表示秒,tv_usec表示毫秒。

        int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); 通过这个函数进行查询,返回值是所有socket的数目,这些socket包含在fd_set结构中,并且已完成准备工作。如果超时,则返回0,如果出错,则返回SOCKET_ERROR。

        使用过程一般遵循以下步骤:

       1、声明FD_SET变量

       2、初始化FD_SET变量

       3、关联文件句柄和FD_SET变量

       4、设置超时时间。

       5、调用select看是否有可用的socket

       6、调用FD_ISSET看究竟是哪个socket可用,对这个socket进行进一步操作。

      源码如下:(或者见http://download.csdn.net/detail/cloud95/4186484

while(TRUE) 
{ 
	printf("nRetCode!=SOCKET_ERROR) while(TRUE)\t"); 
	FD_SET writefd; 
	FD_SET readfd; 
	FD_ZERO(&writefd); 				 //初始化 
	FD_ZERO(&readfd); 
	FD_SET(ClientSocket,&writefd);   //关联FD_SET结构和文件句柄
	FD_SET(ServerSocket,&readfd); 
	timeval timeout={3,0};          //select等待3秒,3秒轮询,要非阻塞就置0
	nRetCode=select(0, &writefd, &readfd, NULL, &timeout); 
	if(SOCKET_ERROR==nRetCode) 
	{ 
		printf("Select错误"); 
		return  nRetCode ; 
	} 
    else if(nRetCode>0) 
	{ 
		if(FD_ISSET(ClientSocket,&writefd)) //测试sock是否可写,数据是来自哪个socket,其实对于非阻塞函数一般不做判断
		{ 
			printf("writefd启动"); 
			if(FALSE ==SendData(ServerSocket))//发送数据接收数据 
			{	 
				printf("SendData(ServerSocket)未成功");   
				return 0; 
			} 
		} 
		if(FD_ISSET(ServerSocket,&readfd)) //测试sock是否可读,数据是来自哪个socket, 
		{ 
			printf("readfd启动\n"); 
			if (FALSE == RecvData(ServerSocket)) //接收数据 
			{ 
				printf("RecvData(ServerSocket)失败"); 
				return 0; 
			} 
		} 
	}
}


 

oracle入门之 Select查询语句(二)

4、单行函数和组函数 (1)单行函数  表中每一行都受到影响,并且每一行都返回一个结果 a、处理字符串的单行函数    upper(字符串),将该字符串的所有字母大写    如,upper ('hel...

oracle入门之 Select查询语句(三)

5、多表查询 多表查询涉及内连接和外连接两部分,首先,假设有两张表: 雇员表s_emp                                                         ...

js入门(4)——关于时间选择列表,date和select

今天遇到一个题目,用户通过页面的下拉列表来设置两个日期,我们根据这两个日期计算出相差的天数 (没有考虑大月和小月,侧重点是说明下拉列表框和onchange事件处理器的使用) 为了方便用户,开始...
  • hey_bei
  • hey_bei
  • 2013年05月16日 15:30
  • 496

从头开始学SQL 入门(二) select的用法

这几天实际用了一下select查询语句,并应用的工作业务中,对select的几种简单用法归纳了一下用法及注意点等--select --查看表内所有内容 select * from tablename ...

MySQL入门之select、from、join、where子句及基本匹配符

MySQL入门之插入select、from、join、where及基本匹配符

JDBC MySQL入门create,delete,insert,select演示

技术乐于分享,转载请说明出处。 一.JDBC编程步骤:   1.注册一个Driver  2. 建立连接 3.获得一个Statement对象  4.通过Statement执行sql语句 5.处理...

I/O 多路复用入门——select/poll/epoll

select poll epoll

MyBatis——入门select

前两天一直在搞AngularJs,各种看代码,昨天晚上要逼近崩溃的时候,决定看点儿别的调解下心情,就换到了MyBatis。        一,基本配置              1,引入myBatis...

SQL入门基础(一) 常用create insert update delete select.............

SQL入门基础(一) 天极网开发频道2011-12-28 17:56 分享到:我要吐槽   基本知识点:   SQL常用字段类型:bit(可选值0、1)、datetime、int、varc...

04-Oracle入门之简单select语句

补充知识 设置语言环境 LANG="zh_CN.UTF-8" [root@localhost ~]# echo $LANG zh_CN.UTF-8 启动和关闭监听服务 [oracle@localhos...
  • lzjsqn
  • lzjsqn
  • 2017年01月07日 17:38
  • 179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SELECT 入门详解
举报原因:
原因补充:

(最多只允许输入30个字)