socket-select函数

最近在用socket编程,用到select函数,于是上网查找资料,如下这篇是讲的比较详细易懂的:
 
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。下面详细介绍一下!
Select的函数格式(我所说的是Unix系统下的伯克利socket编程,和windows下的有区别,一会儿说明):
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct tim *timeout);
先说明两个结构体:
第一,struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。fd_set集合可以通过一些宏由人为来操作,比如清空集合FD_ZERO (fd_set *),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set *),将一个给定的文件描述符从集合中删除FD_CLR(int ,fd_set*),检查集合中指定的文件描述符是否可以读写FD_ISSET(int ,fd_set* )。一会儿举例说明。
第二,struct tim是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个是毫秒数。
具体解释select的参数:
int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。
fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。
fd_set *writefds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的写变化的,即我们关心是否可以向这些文件中写入数据了,如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写,如果没有可写的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的写变化。
fd_set *errorfds同上面两个参数的意图,用来监视文件错误异常。
struct tim* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;第三,timeout的值大于0,这就是等待的超时时间,即 select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。
返回值:
负值:select错误 正值:某些文件可读写或出错 0:等待超时,没有可读写或错误的文件
在有了select后可以写出像样的网络程序来!举个简单的例子,就是从网络上接受数据写入一个文件中。
例子:
main()
{
    int sock;
    FILE *fp;
    struct fd_set fds;
    struct tim timeout={3,0}; //select等待3秒,3秒轮询,要非阻塞就置0
    char buffer[256]={0}; //256字节的接收缓冲区
   
    while(1)
   {
        FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
        FD_SET(sock,&fds); //添加描述符
        FD_SET(fp,&fds); //同上
        maxfdp=sock>fp?sock+1:fp+1;    //描述符最大值加1
        switch(select(maxfdp,&fds,&fds,NULL,&timeout))   //select使用 
        {
            case -1: exit(-1);break; //select错误,退出程序
            case 0:break;  //再次轮询
            default:
                  if(FD_ISSET(sock,&fds)) //测试sock是否可读,即是否网络上有数据
                  {
                        recvfrom(sock,buffer,256,.....);//接受网络数据
                        if(FD_ISSET(fp,&fds)) //测试文件是否可写
                            fwrite(fp,buffer...);//写入文件
                         buffer清空;
                   }// end if break;
          }// end switch
     }//end while

}//end main

WEB:http://blog.sina.com.cn/s/blog_494597e30100dr5h.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript 基础 转

最近面试过一些人, 发现即使经验丰富的开发人员, 对于一些基础的理论和细节也常常会模糊. 写本文是因为就我自己而言第一次学习下面的内容时发现自己确实有所收获和感悟. 其实我们容易忽视的javascript的细节还有更多, 本文仅是冰山一角. 希望大家都能通过本文有所斩获.一. Jav…

从表到里学习JVM实现

在社会化分工、软件行业细分专业化的趋势下,会真的参与到底层系统实现的人肯定是越来越少(比例上说)。真的会参与到JVM实现的人肯定是少数。但如果您对JVM是如何实现的有兴趣、充满好奇,却苦于没有足够系统的知识去深入&#xff0…

2019春第二次课程设计实验报告

2019春第二次课程设计实验报告 一、实验项目名称 用数组实现反弹球消砖块 二、实验项目功能描述 利用键盘按键控制小球方向让小球碰到挡板后反弹上去消除砖块。 三、项目模块结构介绍 四、实现界面展示 五、代码托管链接 https://gitee.com/huangxuannn/events 六、实验总结 上…

[SharePoint 2010] Client Object Model 跨时区查询list item的方法

SharePoint将所有的Datetime类型的数据都以universal的形式(UTC)存储在数据库中,当要在页面上显示类似list item的"Created", "Modified"等时间日期信息时,将数据库中的UTC时间取出来,然后根据当前Site的Regional Settin…

Linux下静态库和动态库的编译连接

http://blog.sina.com.cn/s/blog_4090ba590100t3nu.html .a文件 gcc -c test.c ar rc libtest.a test.o ranlib libtest.a 静态库只要编译出.o文件然后用ar打入包中就可以 动态库或共享库不用libtool工具: gcc -fpic -o test.o -c test gcc -shared -o te…

修改终端服务端口的方法

修改终端服务端口的方法Windows 2000 下的修改办法   win2k的终端服务可以运行在两种方式下:远程管理或应用程序服务器模式。   远程管理模式:允许一定数量的管理员远程管理这个服务器,这个模式对服务器性能的影响程度最低。   应用程序…

PYTHON -c

命令行执行代码转载于:https://www.cnblogs.com/BlueFire-py/p/10957663.html

Linux显示中文乱码解决方法

http://sumit.blog.51cto.com/162317/206698经常使用linux终端,有人上传中文命名的文件显示出中文乱码,下面是解决方法。默认显示的字符编码# echo $LANGen_US.UTF-8修改i18n文件# vi /etc/sysconfig/i18nLANG"zh_CN.GB18030"LANGUAGE"zh…

多行字符串的表示方式

原文载于&#xff1a;http://robinwu.iteye.com/blog/145514 其中最重要的、忽略一切转义字符、多行大包围、相当于的多行版本 1 str <<EOF 2 This isnt a tab: \t 3 and this isnt a newline: \n 4 EOF 5 6 puts str 转载于:https://www.cnblogs.com/kloboh…

nodejs+redis

为什么80%的码农都做不了架构师&#xff1f;>>> redis可以用来管理session http://www.csser.com/board/4f77e6f996ca600f78000936 然后使用的时候redis-server这个服务进程得开着&#xff0c;不然会悲剧的 转载于:https://my.oschina.net/kiloct/blog/137629

Caused by: java.lang.ClassNotFoundException: Cannot find class: User

源代码: <select id"selectAll" resultType"User">select user_id uid,user_name username,user_password password,user_gender gender, user_birthday birthday, user_status status from users</select> 正确代码: <select id"s…

标准C语言库 Glibc 2.15

http://www.oschina.net/p/glibc Glibc 是提供系统调用和基本函数的 C 库&#xff0c;比如open, malloc, printf等等。所有动态连接的程序都要用到它。 Glibc最新更新资讯&#xff0c;共2条 (投递新闻) 1个月前GNU libc 2.15 (Glibc) 发布 2评/952阅 7个月前GLib 2.30.0 发布&…

FxCAD 实验三 实现对象的【属性】事件

接着实验三&#xff0c;本次实验&#xff0c;实现鼠标右键点击【图形对象时】可以弹出一个【WinForm】属性界面 添加一个WindowsForm 界面&#xff0c;如图。类名字&#xff1a;FormBox 回到FxBox类文件 覆盖 SelectEvent 方法&#xff0c;添加上面的代码 运行程序&#xff0c;…

SQL Server文本和图像函数

文本和图像函数 1、查找特定字符串PATINDEX 语法与字符串的patindex一样。 2、获取文本指针TEXTPTR SQLServer在存储文本类型(ntext、text)和图像数据类型(image)时&#xff0c;默认情况是与常见的基本数据类型(如char、int等)这样的数据时单独存储的&#xff0c;也就是说&…

图像的灰度处理

图像的灰度处理的三种方法&#xff1a; 1.imread的方法将像素值修改为0 2.调用一个RGB转灰度的方法实现灰度转化&#xff08;cv2.COLOR_BGR2GRAY&#xff09; 3.R G B 的均值取灰度值来灰度转化&#xff08;原理&#xff09; 处理结果 如下: 转载于:https://www.cnblogs.com/Ja…

在Linux终端下调用可执行文件时总要加上符号./的原因

原网址 : http://blog.csdn.net/snakebite1985/article/details/1638453 刚接触Shell时总感到很奇怪&#xff1a;如果当前的Shell工作目录为/home/Victor/&#xff0c;且此目录下有一个叫做myproc的可执行文件&#xff0c;那么简单的在命令行中输入myproc并回车并不能调用这个…

面向对象基础-委托与事件

首先举一个实例&#xff1a;创建一个控制台程序&#xff0c;需求是&#xff1a;有一只猫Tom&#xff0c;有两只老鼠Jerry和Jack&#xff0c;Tom只叫一声“喵&#xff0c;我是Tom”&#xff0c;两只老鼠就说“老猫来了&#xff0c;快跑”&#xff0c;我们来分析一下&#xff1a;…

SQL Server数学函数

数学函数 1、计算绝对值ABS ABS函数对一个数值表达式结果计算绝对值(bit数据类型除外)&#xff0c;返回整数。 语法结构&#xff1a; ABS(数值表达式) 返回值&#xff1a;与数值表达式类型一致的数据 示例&#xff1a; SELECT ABS(-1) --输出 1 2、获取大于等于最小整数值Ce…

tornado框架基础11-tornado异步

01 同步和异步 生活中常常会遇到在超市排队买东西的情况&#xff0c;排在你前面的人没有结算完成&#xff0c;你就无法付账&#xff0c;在计算机中也有类似的情形&#xff0c;一个程序在执行之前&#xff0c;需要等待其他的程序执行完成&#xff0c;大家还能举出其他的例子吗&a…

select,epoll,poll比较

http://blog.sina.com.cn/s/blog_8fa7dd41010153zx.html select&#xff0c;poll&#xff0c;epoll简介 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是&#xff1a; 1 单个进程可监视的fd数量被限制 2 需要维护一个用…