select read write
转载:http://blog.csdn.net/beginning1126/article/details/8057498
- <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="font-size:14px; "><strong>1. 服务器</strong></span></p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "> 当有新连接来的时候,通过在select上轮循写的fd(文件描述符)发送一句欢迎词。然后每次受到客户端的数据后,把接受到的数据返回给客户端。演示了在select上轮循写的操作。</p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; ">对于监视读操作,只有当数据来的时候,读操作的fd才会返回.而对于写的操作fd,则是轮询。</p>
- /*
- the example is writed by minrongf,date: 20090214
- #filename: selectsvr.c
- * */
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <sys/time.h>
- typedef int SOCKET;
- #define MAXBUFSIZE 1024
- #define NLISTEN 1024
- #define isvalidsock(s) ( ( s ) > 0 )
- void set_address( char *hname, char *sname,struct sockaddr_in *sap, char *protocol )
- {
- struct servent *sp;
- struct hostent *hp;
- char *endptr;
- short port;
- bzero( sap, sizeof( *sap ) );
- sap->sin_family = AF_INET;
- if ( hname != NULL )
- {
- if ( !inet_aton( hname, &sap->sin_addr ) )
- {
- hp = gethostbyname( hname );
- if ( hp == NULL )
- error( 1, 0, "unknown host: %s/n", hname );
- sap->sin_addr = *( struct in_addr * )hp->h_addr;
- }
- }
- else
- sap->sin_addr.s_addr = htonl( INADDR_ANY );
- port = strtol( sname, &endptr, 0 );
- if ( *endptr == '/0' )
- sap->sin_port = htons( port );
- else
- {
- sp = getservbyname( sname, protocol );
- if ( sp == NULL )
- error( 1, 0, "unknown service: %s/n", sname );
- sap->sin_port = sp->s_port;
- }
- }
- SOCKET tcp_server( char *hname, char *sname )
- {
- struct sockaddr_in local;
- SOCKET s;
- const int on = 1;
- set_address( hname, sname, &local, "tcp" );
- s = socket( AF_INET, SOCK_STREAM, 0 );
- if ( !isvalidsock( s ) )
- error( 1, errno, "socket call failed" );
- if ( setsockopt( s, SOL_SOCKET, SO_REUSEADDR,
- ( char * )&on, sizeof( on ) ) )
- error( 1, errno, "setsockopt failed" );
- if ( bind( s, ( struct sockaddr * ) &local,
- sizeof( local ) ) )
- error( 1, errno, "bind failed" );
- if ( listen( s, NLISTEN ) )
- error( 1, errno, "listen failed" );
- return s;
- }
- int main(int argc,char**argv)
- {
- int i,maxi,maxfd,listenfd,connfd,sockfd;
- int nready,client[FD_SETSIZE];
- fd_set rset,alllset,wset,wsetsave;
- char buf[MAXBUFSIZE];
- socklen_t clilen;
- struct sockaddr_in servaddr,cliaddr;
- int rval;
- struct timeval to;
- int n = 0;
- listenfd = tcp_server(NULL,"5000");
- FD_ZERO(&alllset);
- FD_ZERO(&wsetsave);
- FD_SET(listenfd,&alllset);
- maxfd = listenfd;
- for(i = 0; i < FD_SETSIZE;i++)
- client[i] = -1;
- maxi = -1;
- while(1)
- {
- FD_ZERO(&rset);
- rset = alllset;
- wset = wsetsave;
- printf("server waiting...,maxfd:%d/n",maxfd);
- nready = select(maxfd+1,&rset,&wset,NULL,NULL);
- if(FD_ISSET(listenfd,&rset))
- {
- clilen = sizeof(cliaddr);
- connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);
- for(i = 0; i< FD_SETSIZE; i++)
- {
- if(client[i] < 0)
- {
- client[i] = connfd;
- break;
- }
- }
- if(i == FD_SETSIZE)
- {
- printf("too many clients /n");
- exit(1);
- }
- FD_SET(connfd,&alllset);
- FD_SET(connfd,&wsetsave);
- printf("addinng client on fd %d/n",connfd);
- if(connfd > maxfd)
- maxfd = connfd;
- if( i > maxi)
- maxi = i;
- if(--nready <= 0)
- continue;
- }
- for(i = 0; i <= maxi; i++)
- {
- if((sockfd = client[i]) < 0 )
- continue;
- if(FD_ISSET(sockfd,&rset))
- {
- bzero(buf,100);
- if((n = recv(sockfd,buf,MAXBUFSIZE,0)) <= 0)
- {
- close(sockfd);
- FD_CLR(sockfd,&alllset);
- client[i] = -1;
- printf("recv error,client:%d exit/n",sockfd);
- }
- else
- {
- sleep(2);
- printf("serving client read on fd %d,recv datalen: %d,data:%s /n",sockfd,n,buf);
- write(sockfd,buf,n);
- }
- if(--nready <= 0 )
- break;
- }
- else if(FD_ISSET(sockfd,&wset))
- {
- char buf1[100] = {""};
- sprintf(buf1,"Welcome the selectsvr .../n");
- if((n = send(sockfd,buf1,strlen(buf1),0)) <= 0)
- {
- close(sockfd);
- FD_CLR(sockfd,&wsetsave);
- printf("send error,client:%d exit/n",sockfd);
- }
- else
- {
- FD_CLR(sockfd,&wsetsave);
- printf("serving client write on fd %d,data:%s/n",sockfd,buf1);
- }
- sleep(5);
- }
- }
- }
- }
- <span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; ">通过: gcc selectsvr.c -o selectsvr 编译得到执行文件selectsvr</span>
- <span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; "><span style="color: rgb(51, 51, 51); font-family: Arial; line-height: 26px; text-align: left;font-size:14px; "> 2. 客户端</span>
- </span>
- /*
- the example is writed by minrongf,date: 20090214
- #filename:selectcli.c
- * */
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <sys/time.h>
- typedef int SOCKET;
- #define MAXBUFSIZE 1024
- #define NLISTEN 1024
- #define isvalidsock(s) ( ( s ) > 0 )
- void set_address( char *hname, char *sname,struct sockaddr_in *sap, char *protocol )
- {
- struct servent *sp;
- struct hostent *hp;
- char *endptr;
- short port;
- bzero( sap, sizeof( *sap ) );
- sap->sin_family = AF_INET;
- if ( hname != NULL )
- {
- if ( !inet_aton( hname, &sap->sin_addr ) )
- {
- hp = gethostbyname( hname );
- if ( hp == NULL )
- error( 1, 0, "unknown host: %s/n", hname );
- sap->sin_addr = *( struct in_addr * )hp->h_addr;
- }
- }
- else
- sap->sin_addr.s_addr = htonl( INADDR_ANY );
- port = strtol( sname, &endptr, 0 );
- if ( *endptr == '/0' )
- sap->sin_port = htons( port );
- else
- {
- sp = getservbyname( sname, protocol );
- if ( sp == NULL )
- error( 1, 0, "unknown service: %s/n", sname );
- sap->sin_port = sp->s_port;
- }
- }
- /* tcp_client - set up for a TCP client */
- SOCKET tcp_client( char *hname, char *sname )
- {
- struct sockaddr_in peer;
- SOCKET s;
- set_address( hname, sname, &peer, "tcp" );
- s = socket( AF_INET, SOCK_STREAM, 0 );
- if ( !isvalidsock( s ) )
- error( 1, errno, "socket call failed" );
- if ( connect( s, ( struct sockaddr * )&peer,
- sizeof( peer ) ) )
- error( 1, errno, "connect failed" );
- return s;
- }
- int main(int argc,char**argv)
- {
- SOCKET s;
- s = tcp_client(NULL,"5000");
- char buf[100] = {""};
- recv(s,buf,100,0);
- printf("%s/n",buf);
- printf("please input data(quit exit):");
- while(fgets(buf,100,stdin) != NULL)
- {
- if(strcmp(buf,"quit") == 0)
- break;
- send(s,buf,strlen(buf),0);
- recv(s,buf,100,0);
- printf("echo data:%s/n",buf);
- printf("please input data(quit exit):");
- }
- }
通过: gcc selectcli.c -o selectcli 得到客户端执行程序.
在上面的测试例子中,程序只是简单演示了如何使用select来轮询可读、可写操作的。
select read write相关推荐
- jeee的基础知识(转载)
Servlet: 1)servlet : servlet是一个特殊的java程序,需要在web服务器上运行,并接收和响应客户端的请求,遵循http协议. 2)Servlet;作用: 主要用于控制层. ...
- ORACLE-SQL较全面笔记
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter use ...
- 设置select下拉框不可修改的→“四”←种方法
设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...
- Go 知识点(09)— for select 作用于 channel
1. for select 作用于未关闭的通道 1.1 没有 default 分之场景 先看下面代码 func main() {ch := make(chan int, 3)go func() {ti ...
- 【Sql Server】DateBase-简单的Select查询
Select语句查询 小技巧:select 12*13 as 计算结果 Distinct:消除重复列 Where [and/or][多个条件](like '河南%') Where 字句运算符 Betw ...
- 根据JSON自动生成select联动
公用js var CreateSelect = function (obj) {this.__ID__ = 0;this.$dom = $(obj.dom);this.selectList = obj ...
- 合肥工业大学—SQL Server数据库实验八:使用聚集函数的SELECT语句
在数据库EDUC中用SQL语句实现如下查询: 1) 查询学生的总人数 -- 查询学生的总人数 select count(*) from student select count(1) from stu ...
- MySQL基础之select基本查询
DQL语言基本查询 一.基本的select语句 1.查询常量 2.从表中查数据 3.使用列的别名查询 4.去重 5.空值NULL参与运算 6.过滤数据 二. 运算符 1.算术运算符 2.比较运算符 3 ...
- select 和 order by
select 的优先级要高于order by,相当于是select先创建了一个临时表,再通过临时表去排序.所以,对于一些sum()的汇总,在进行排序,实际是排序的select后的字段,而不是表里的那个 ...
- js 动态加载select触发事件
动态加载select后,手动调用一下 subjectChange函数,模拟触发change事件 function hallidChange(value) {$.ajax({type: "po ...
最新文章
- 全球每年仅一位!中国数学家印卧涛荣获优化领域Egon Balas奖
- linux性能测试命令h,Linux性能测试 pmap命令详解
- 化工设备与反应器 第三章 直梁的弯曲
- linux 433发送驱动
- TestFlight
- win7上安装wince6.0
- 关于PaddleNLP如何加载训练好的模型进行NER
- OpenCV4每日一练day1:VS2015+opencv4.1.0+读图测试
- 2018-03-02 certtool的用法
- 尚硅谷大数据技术之Hadoop(入门)
- 轻松理解Shel脚本中的变量(一)
- 如何获取多屏幕显示器工作区域
- Html HBuilder封装APP
- svchost.exe占用cpu100%
- Excel文件双击打开后无内容且不可编辑,再次双击文件正常显示
- 线性方程组的矩阵形式
- 计算机里面看不到桌面是什么原因,电脑桌面图标都没了是什么情况?电脑桌面图标都没了解决方法...
- java 音频倍速播放_Android MediaPlayer 音频倍速播放,调整播放速度
- 阿里妈妈广告点击转化率(CTR)预估项目(附github代码)
- 【linux下CA证书过期怎么处理】
热门文章
- bzoj2375 疯狂的涂色
- js 递归函数的使用及常用函数
- Oracle锁机制的总结【转】
- Request的getParameter和getAttribute方法的差别
- Excel 一键上传到数据库
- 底量超顶量超级大黑马指标源码_底量超顶量+地量买点_月线底量超顶量大牛股,底量超顶量超级大黑马,底量超顶量买入指标,后量超前量买入指标_指标公式分享交流论坛_理想论坛 - 股票论坛...
- 向量外积_解析几何 -向量
- python 定义变量_用python解决动态的定义变量名(并给其赋值方法:大数据处理)...
- 多源计算机培训,多源数据汇聚的多流形学习算法研究
- python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例