select read write

转载:http://blog.csdn.net/beginning1126/article/details/8057498

[cpp] view plaincopy
  1. <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>  
[cpp] view plaincopy
  1. /* 
  2.  the example is writed by minrongf,date: 20090214 
  3. #filename: selectsvr.c 
  4.  * */  
  5. #include <stdio.h>   
  6. #include <stdlib.h>   
  7. #include <errno.h>   
  8. #include <string.h>   
  9. #include <netdb.h>   
  10. #include <sys/types.h>   
  11. #include <netinet/in.h>   
  12. #include <sys/socket.h>   
  13. #include <sys/time.h>  
  14. typedef int SOCKET;  
  15. #define MAXBUFSIZE 1024  
  16. #define NLISTEN 1024  
  17. #define isvalidsock(s)  ( ( s ) > 0 )  
  18. void set_address( char *hname, char *sname,struct sockaddr_in *sap, char *protocol )  
  19. {  
  20.     struct servent *sp;  
  21.     struct hostent *hp;  
  22.     char *endptr;  
  23.     short port;  
  24.   
  25.     bzero( sap, sizeof( *sap ) );  
  26.     sap->sin_family = AF_INET;  
  27.     if ( hname != NULL )  
  28.     {  
  29.         if ( !inet_aton( hname, &sap->sin_addr ) )  
  30.         {  
  31.             hp = gethostbyname( hname );  
  32.             if ( hp == NULL )  
  33.                 error( 1, 0, "unknown host: %s/n", hname );  
  34.             sap->sin_addr = *( struct in_addr * )hp->h_addr;  
  35.         }  
  36.     }  
  37.     else  
  38.         sap->sin_addr.s_addr = htonl( INADDR_ANY );  
  39.     port = strtol( sname, &endptr, 0 );  
  40.     if ( *endptr == '/0' )  
  41.         sap->sin_port = htons( port );  
  42.     else  
  43.     {  
  44.         sp = getservbyname( sname, protocol );  
  45.         if ( sp == NULL )  
  46.             error( 1, 0, "unknown service: %s/n", sname );  
  47.         sap->sin_port = sp->s_port;  
  48.     }  
  49. }  
  50.   
  51. SOCKET tcp_server( char *hname, char *sname )  
  52. {  
  53.     struct sockaddr_in local;  
  54.     SOCKET s;  
  55.     const int on = 1;  
  56.   
  57.     set_address( hname, sname, &local, "tcp" );  
  58.     s = socket( AF_INET, SOCK_STREAM, 0 );  
  59.     if ( !isvalidsock( s ) )  
  60.         error( 1, errno, "socket call failed" );  
  61.   
  62.     if ( setsockopt( s, SOL_SOCKET, SO_REUSEADDR,  
  63.         ( char * )&on, sizeof( on ) ) )  
  64.         error( 1, errno, "setsockopt failed" );  
  65.   
  66.     if ( bind( s, ( struct sockaddr * ) &local,  
  67.          sizeof( local ) ) )  
  68.         error( 1, errno, "bind failed" );  
  69.   
  70.     if ( listen( s, NLISTEN ) )  
  71.         error( 1, errno, "listen failed" );  
  72.   
  73.     return s;  
  74. }  
  75.   
  76.   
  77.   
  78. int main(int argc,char**argv)  
  79. {  
  80.    int i,maxi,maxfd,listenfd,connfd,sockfd;  
  81.    int nready,client[FD_SETSIZE];  
  82.    fd_set rset,alllset,wset,wsetsave;  
  83.    char buf[MAXBUFSIZE];  
  84.    socklen_t clilen;  
  85.    struct sockaddr_in servaddr,cliaddr;  
  86.    int rval;  
  87.    struct timeval to;  
  88.    int n = 0;  
  89.    listenfd =  tcp_server(NULL,"5000");  
  90.   
  91.   
  92.    FD_ZERO(&alllset);  
  93.    FD_ZERO(&wsetsave);  
  94.    FD_SET(listenfd,&alllset);  
  95.    maxfd = listenfd;  
  96.    for(i = 0; i < FD_SETSIZE;i++)  
  97.        client[i] = -1;  
  98.    maxi = -1;  
  99.    while(1)  
  100.    {  
  101.     FD_ZERO(&rset);  
  102.         rset = alllset;  
  103.     wset = wsetsave;  
  104.     printf("server waiting...,maxfd:%d/n",maxfd);  
  105.     nready = select(maxfd+1,&rset,&wset,NULL,NULL);  
  106.     if(FD_ISSET(listenfd,&rset))  
  107.     {  
  108.        clilen = sizeof(cliaddr);  
  109.        connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);  
  110.        for(i = 0; i< FD_SETSIZE; i++)  
  111.            {  
  112.            if(client[i] < 0)  
  113.            {  
  114.                         client[i] = connfd;  
  115.             break;  
  116.            }  
  117.        }  
  118.        if(i == FD_SETSIZE)  
  119.        {  
  120.               printf("too many clients /n");  
  121.               exit(1);  
  122.        }  
  123.            FD_SET(connfd,&alllset);  
  124.        FD_SET(connfd,&wsetsave);  
  125.        printf("addinng client on fd %d/n",connfd);  
  126.        if(connfd > maxfd)  
  127.               maxfd = connfd;  
  128.        if( i > maxi)  
  129.                maxi = i;  
  130.        if(--nready <= 0)  
  131.                 continue;  
  132.        
  133.        }  
  134.        for(i = 0; i <= maxi; i++)  
  135.        {  
  136.            if((sockfd = client[i]) < 0 )  
  137.           continue;  
  138.       if(FD_ISSET(sockfd,&rset))  
  139.       {  
  140.               bzero(buf,100);  
  141.               if((n = recv(sockfd,buf,MAXBUFSIZE,0)) <= 0)  
  142.           {  
  143.                   close(sockfd);  
  144.             FD_CLR(sockfd,&alllset);  
  145.             client[i] = -1;  
  146.             printf("recv error,client:%d exit/n",sockfd);  
  147.             
  148.           }  
  149.           else  
  150.           {  
  151.                   sleep(2);  
  152.                   printf("serving client read on fd %d,recv datalen: %d,data:%s /n",sockfd,n,buf);  
  153.           write(sockfd,buf,n);  
  154.           }  
  155.           if(--nready <= 0 )  
  156.           break;      
  157.   
  158.           }  
  159.       else if(FD_ISSET(sockfd,&wset))  
  160.       {  
  161.               char buf1[100] = {""};  
  162.               sprintf(buf1,"Welcome the selectsvr .../n");  
  163.               if((n = send(sockfd,buf1,strlen(buf1),0)) <= 0)  
  164.               {  
  165.                    close(sockfd);  
  166.            FD_CLR(sockfd,&wsetsave);  
  167.            printf("send error,client:%d exit/n",sockfd);  
  168.           }  
  169.           else  
  170.           {  
  171.                    FD_CLR(sockfd,&wsetsave);  
  172.                    printf("serving client write on fd %d,data:%s/n",sockfd,buf1);  
  173.           }  
  174.           sleep(5);  
  175.       }  
  176.   
  177.     }  
  178.   }   
  179.   
  180. }  
[cpp] view plaincopy
  1. <span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; ">通过: gcc selectsvr.c -o selectsvr 编译得到执行文件selectsvr</span>  
[cpp] view plaincopy
  1. <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>  
  2. </span>  
[cpp] view plaincopy
  1. /* 
  2.  the example is writed by minrongf,date: 20090214 
  3. #filename:selectcli.c 
  4.  * */  
  5. #include <stdio.h>   
  6. #include <stdlib.h>   
  7. #include <errno.h>   
  8. #include <string.h>   
  9. #include <netdb.h>   
  10. #include <sys/types.h>   
  11. #include <netinet/in.h>   
  12. #include <sys/socket.h>   
  13. #include <sys/time.h>  
  14. typedef int SOCKET;  
  15. #define MAXBUFSIZE 1024  
  16. #define NLISTEN 1024  
  17. #define isvalidsock(s)  ( ( s ) > 0 )  
  18. void set_address( char *hname, char *sname,struct sockaddr_in *sap, char *protocol )  
  19. {  
  20.     struct servent *sp;  
  21.     struct hostent *hp;  
  22.     char *endptr;  
  23.     short port;  
  24.   
  25.     bzero( sap, sizeof( *sap ) );  
  26.     sap->sin_family = AF_INET;  
  27.     if ( hname != NULL )  
  28.     {  
  29.         if ( !inet_aton( hname, &sap->sin_addr ) )  
  30.         {  
  31.             hp = gethostbyname( hname );  
  32.             if ( hp == NULL )  
  33.                 error( 1, 0, "unknown host: %s/n", hname );  
  34.             sap->sin_addr = *( struct in_addr * )hp->h_addr;  
  35.         }  
  36.     }  
  37.     else  
  38.         sap->sin_addr.s_addr = htonl( INADDR_ANY );  
  39.     port = strtol( sname, &endptr, 0 );  
  40.     if ( *endptr == '/0' )  
  41.         sap->sin_port = htons( port );  
  42.     else  
  43.     {  
  44.         sp = getservbyname( sname, protocol );  
  45.         if ( sp == NULL )  
  46.             error( 1, 0, "unknown service: %s/n", sname );  
  47.         sap->sin_port = sp->s_port;  
  48.     }  
  49. }  
  50.   
  51. /* tcp_client - set up for a TCP client */  
  52. SOCKET tcp_client( char *hname, char *sname )  
  53. {  
  54.     struct sockaddr_in peer;  
  55.     SOCKET s;  
  56.   
  57.     set_address( hname, sname, &peer, "tcp" );  
  58.     s = socket( AF_INET, SOCK_STREAM, 0 );  
  59.     if ( !isvalidsock( s ) )  
  60.         error( 1, errno, "socket call failed" );  
  61.   
  62.     if ( connect( s, ( struct sockaddr * )&peer,  
  63.          sizeof( peer ) ) )  
  64.         error( 1, errno, "connect failed" );  
  65.   
  66.     return s;  
  67. }  
  68.   
  69.   
  70. int main(int argc,char**argv)  
  71. {  
  72.    SOCKET s;  
  73.    s = tcp_client(NULL,"5000");  
  74.    char buf[100] = {""};  
  75.    recv(s,buf,100,0);  
  76.    printf("%s/n",buf);  
  77.    printf("please input data(quit exit):");  
  78.    while(fgets(buf,100,stdin) != NULL)  
  79.    {  
  80.         if(strcmp(buf,"quit") == 0)  
  81.             break;  
  82.         send(s,buf,strlen(buf),0);  
  83.         recv(s,buf,100,0);  
  84.         printf("echo data:%s/n",buf);  
  85.         printf("please input data(quit exit):");  
  86.    }  
  87.      
  88. }  

通过: gcc selectcli.c -o selectcli 得到客户端执行程序.

  在上面的测试例子中,程序只是简单演示了如何使用select来轮询可读、可写操作的。


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

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

相关文章

数据结构(七)图的遍历(递归非递归方法)

图的遍历&#xff08;递归非递归方法&#xff09;#include<iostream> #include<stdio.h> #include<stack> #include<queue> using namespace std;typedef char VertexType; typedef int EdgeType;#define MAXVEX 100 #define INF 65535 bool visited[M…

Linux IO复用区别与epoll详解

转载&#xff1a;http://blog.csdn.net/hacker00011000/article/details/52160590 一、select、poll、epoll之间的区别总结[整理]   select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就通过一种机制&#xff0c;可以监视多个描述符&#xff0c;一…

简单图和多重图

一、简单图    ① 不存在重复边&#xff1b;    ② 不存在顶点到自身的边&#xff1b; 二、多重图   ① 某两结点之间边数多于一条&#xff1b;   ② 允许顶点通过一条边和自己关联&#xff1b;

C++笔记:select多路复用机制

转载&#xff1a;http://blog.csdn.net/qdx411324962/article/details/42499535 函数作用&#xff1a; 系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待&#xff0c;直到被监视的文件…

交叉编译执行应用程序出现:No such file or directory

问题分析 当我在arm板子上执行交叉编译过的程序的时候发现了这个错误。通过百度查询基本都是缺少32位库什么的,但是都不能解决问题。 然后我用ll指令&#xff0c;也排除了权限的原因。 我们用ldd指令发现&#xff0c;它不是动态执行的&#xff0c;虽然我们可以使用-static指…

select、poll、epoll 比较

转载&#xff1a;http://blog.csdn.net/dodo_328/article/details/39081183 1.Selet&#xff1a;本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。 缺点&#xff1a;1 单个进程可监视的fd数量被限制&#xff0c;因为受描述符集合fd_set限制&#xff0c;fd数量…

C库函数 File

C库函数常用的有&#xff1a;fopen, fclose, fread, fwrite, fgets, fputs, fscanf, fprintf, fseek, fgetc, fputc, ftell, feof, flush等&#xff0c; 当使用fopen打开一个文件时通常返回一个文件指针 FILE *fp。FILE类型是一个结构体&#xff0c;包含文件描述符&#xff08;…

Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍

转载&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/43457393 写在开头&#xff1a; 在上一节中我们学习了一些基础的用来支持网络编程的API&#xff0c;包括“套接字的地址结构”、“字节排序函数”等。这些API几乎是所有的网络编程中都会使用的一些&…

C库函数与系统函数的关系

转载于:https://www.cnblogs.com/lr1402585172/p/10464933.html

Unix网络编程(六)高级I/O技术之复用技术 select

转载&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/44887411 I/O复用技术 本文将讨论网络编程中的高级I/O复用技术&#xff0c;将从下面几个方面进行展开&#xff1a; a. 什么是复用技术呢&#xff1f; b. 什么情况下需要使用复用技术呢&#xff1f; c. …

open、read、write、文件类型

open&#xff0c;打开一个文件、创建一个文件或判断一个文件是否存在。 头文件&#xff1a;<sys/types.h> <sys/stat.h> <fcntl.h> 重载函数有&#xff1a;int open(const char *pathname, int flags) int open(const char *pathname, int flags, mode_t m…

用模板写单链表 尹成

转载&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39081953 为了加深对模板的理解&#xff0c;我们今天一起用模板写一个单链表&#xff0c;希望通过这个例子&#xff0c;能够帮助大家加深对模板的体会&#xff0c;具体如下&#xff1a; SList.hpp内容&#xf…

lseek、stat、access、chmod、strtol、truncate、unlink

lseek&#xff0c;可实现计算文件长度&#xff0c;以及文件扩展。 int ret lseek(fd, 0, SEEK_END); //文件长度printf("file lendth %d\n", ret); int ret lseek(fd, 2000, SEEK_END); //文件拓展2000个byte 在文件末尾偏移2000printf("return va…

inode浅谈

索引节点inode&#xff1a;保存的其实是实际的数据的一些信息&#xff0c;这些信息称为“元数据”(也就是对文件属性的描述)。例如&#xff1a;文件大小&#xff0c;设备标识符&#xff0c;用户标识符&#xff0c;用户组标识符&#xff0c;文件模式&#xff0c;扩展属性&#x…

Openssl-MD5

http://blog.csdn.net/sunspider107/article/details/7395904 MD5是最常用的一个信息摘要算法&#xff0c;虽然现在慢慢被SHA1算法替代&#xff0c;但还是应用广泛。 MD5的计算结果是16个字节。 int MD5_Init(MD5_CTX *c); 初始化MD5 Context参数&#xff1b; c: MD5 context; …

opendir、readdir以及使用

opendir&#xff0c;打开一个目录。 函数原型&#xff1a;DIR *opendir(const char *name) DIR *fopendir(int fd) DIR是一个结构指针&#xff0c;是一个内部结构&#xff0c;保存所打开的目录信息。函数出错返回NULL readdir&#xff0c;读目录 ,<dirent.h> 函数原型&am…

Linux下C语言使用openssl库进行MD5校验

http://blog.csdn.net/cassie_huang/article/details/53212933 作者&#xff1a;无脑仔的小明 出处&#xff1a;http://www.cnblogs.com/wunaozai/ 我们以一个字符串为例&#xff0c;新建一个文件filename.txt&#xff0c;在文件内写入hello &#xff0c;然后在Linux下可以使…

dup、dup2、fcntl

dup、dup2&#xff0c;复制文件描述符 int dup(int oldfd);  //返回文件描述表中没有被占用的最小可用的描述符&#xff0c;新旧描述符作用相同 int dup2(int oldfd, int newfd);  //如果new已经被打开&#xff0c;先关闭再拷贝就会指向同一个文件&#xff0c;如果old和new…

进程

创建子进程&#xff1a;fork调用&#xff0c; 一次fork调用返回两个值&#xff0c;1、返回子进程的pid&#xff08;非负整数&#xff09; 2、返回0 父进程的fork返回子进程的id&#xff0c;子进程的fork返回0&#xff08;表示执行成功&#xff09; 创建单个子进程&#xff1a; …

Ubuntu在vmware虚拟机无法上网的解决方法

http://blog.csdn.net/xueyushenzhou/article/details/50460183 在vmware中安装Ubuntu之后&#xff0c;我们希望基本的功能如上网、传输文件等功能都是可用的&#xff0c;但是经常遇到不能上网的情况。使用笔记本时&#xff0c;我们经常希望能通过无线网卡上网&#xff0c;但是…