Socket网络编程--小小网盘程序(5)

http://www.cnblogs.com/wunaozai/p/3893469.html

 各位好呀!这一小节应该就是这个小小网盘程序的最后一小节了,这一节将实现最后的三个功能,即列出用户在服务器中的文件列表,还有删除用户在服务器中的文件,最后的可以共享文件给好友。

  列出用户在服务器中的文件列表

  增加一个结构体

1 struct FileList
2 {
3     int cnt;
4     char list[16][128];
5 };

  为了方便我就假设服务器最多可以存16个单个用户的文件。如果想要支持更多的文件,这里可以增加一个int pages;用于分页作用,我们在服务器中获取文件时,可以根据分页进行发送。这样既方便又能支持多文件。

  client.cpp这个客户端文件增加一个函数

复制代码
 1 int file_list(struct Addr addr,struct User user)
 2 {
 3     struct sockaddr_in servAddr;
 4     struct hostent *host;
 5     struct Control control;
 6     struct FileList filelist;
 7     int sockfd;
 8 
 9     host=gethostbyname(addr.host);
10     servAddr.sin_family=AF_INET;
11     servAddr.sin_addr=*((struct in_addr *)host->h_addr);
12     servAddr.sin_port=htons(addr.port);
13     if(host==NULL)
14     {
15         perror("获取IP地址失败");
16         exit(-1);
17     }
18     if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
19     {
20         perror("socket创建失败");
21         exit(-1);
22     }
23     if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-1)
24     {
25         perror("connect 失败");
26         exit(-1);
27     }
28 
29     //控制信号
30     control.control=FILE_LIST;
31     control.uid=user.uid;
32     if(send(sockfd,(char *)&control,sizeof(struct Control),0)<0)
33     {
34         perror("文件指纹发送失败");
35         exit(-1);
36     }
37     if(recv(sockfd,(char *)&filelist,sizeof(struct FileList),0)<0)
38     {
39         perror("获取文件列表失败");
40         exit(-1);
41     }
42     for(int i=0;i<filelist.cnt;i++)
43     {
44         printf("--> %s\n",filelist.list[i]);
45     }
46 
47     close(sockfd);
48     return 0;
49 }
复制代码

  然后在主函数中调用即可。

  server.cpp实现,在主函数的case FILE_LIST:处修改如下

复制代码
1  case FILE_LIST:
2  {
3       struct File file;
4       struct FileList filelist;
5       file.uid=control.uid;
6       mysql_get_file_list(file,&filelist);
7       send(clientfd,(char *)&filelist,sizeof(struct FileList),0);
8       break;
9   }
复制代码

  然后再增加一个对应的mysql_get_file_list函数

复制代码
 1 int mysql_get_file_list(struct File file,struct FileList *filelist)
 2 {
 3     MYSQL conn;
 4     MYSQL_RES * res_ptr;
 5     MYSQL_ROW result_row;
 6     int res;int row;int column;
 7     int i,j;
 8     char sql[256]={0};
 9     char ch[64];
10     //select filename from files,relations where relations.uid=[file].uid and relations.fid=files.fid;
11     strcpy(sql,"select filename from files,relations where relations.uid=");
12     sprintf(ch,"%d",file.uid);
13     strcat(sql,ch);
14     strcat(sql," and relations.fid=files.fid ;");
15     //printf("==>%s\n",sql);
16 
17     mysql_init(&conn);
18     if(mysql_real_connect(&conn,"localhost","root","","filetranslate",0,NULL,CLIENT_FOUND_ROWS))
19     {
20         res=mysql_query(&conn,sql);
21         if(res)
22         {
23             perror("select sql error1");
24         }
25         else
26         {
27             res_ptr=mysql_store_result(&conn);
28             if(res_ptr)
29             {
30                 column=mysql_num_fields(res_ptr);
31                 row=mysql_num_rows(res_ptr)+1;
32                 //按行输出结果
33                 filelist->cnt=row-1;
34                 for(i=1;i<row;i++)
35                 {
36                     result_row=mysql_fetch_row(res_ptr);
37                     strcpy(filelist->list[i-1],result_row[0]);
38                     //printf("%s",result_row[0]);
39                 }
40             }
41             else
42             {
43                 printf("没有数据\n");
44             }
45         }
46     }
47     else
48     {
49         perror("Connect Failed1\n");
50         exit(-1);
51     }
52     mysql_close(&conn);
53     return 0;
54 }
复制代码

  运行时的截图

 

  删除服务器中的用户文件

  在client.cpp中增加一个file_delete函数

复制代码
 1 int file_delect(struct Addr addr,struct User user,char *filenames)
 2 {
 3     struct sockaddr_in servAddr;
 4     struct hostent *host;
 5     struct Control control;
 6     struct File file;
 7     int sockfd;
 8 
 9     host=gethostbyname(addr.host);
10     servAddr.sin_family=AF_INET;
11     servAddr.sin_addr=*((struct in_addr *)host->h_addr);
12     servAddr.sin_port=htons(addr.port);
13     if(host==NULL)
14     {
15         perror("获取IP地址失败");
16         exit(-1);
17     }
18     if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
19     {
20         perror("socket创建失败");
21         exit(-1);
22     }
23     if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-1)
24     {
25         perror("connect 失败");
26         exit(-1);
27     }
28 
29     //控制信号
30     control.control=FILE_DELECT;
31     control.uid=user.uid;
32     if(send(sockfd,(char *)&control,sizeof(struct Control),0)<0)
33     {
34         perror("文件指纹发送失败");
35         exit(-1);
36     }
37     file.uid=user.uid;
38     strcpy(file.filename,filenames);
39     if(send(sockfd,(char *)&file,sizeof(struct File),0)<0)
40     {
41         perror("删除文件失败");
42         exit(-1);
43     }
44     char ch[32];
45     memset(ch,0,sizeof(ch));
46     if(recv(sockfd,ch,sizeof(ch),0)<0)
47     {
48         perror("删除文件失败");
49         exit(-1);
50     }
51     if(ch[0]=='y') //删除成功
52     {
53         printf("删除成功\n");;
54     }
55     else if(ch[0]=='n') //删除失败
56     {
57         printf("删除失败,确认是否有该文件\n");;
58     }
59     close(sockfd);
60     return 0;
61 }
复制代码

  在server.cpp的main函数中增加

复制代码
 1 case FILE_DELECT:
 2 {
 3     struct File file;
 4     char ch[64];
 5     memset(ch,0,sizeof(ch));
 6     recv(clientfd,(char *)&file,sizeof(struct File),0);
 7     int t=mysql_delete_file(file);
 8     if(t==-1)
 9     {
10          printf("没有对应的文件\n");;
11          strcpy(ch,"no");
12          send(clientfd,ch,64,0);
13          break;
14      }
15       strcpy(ch,"yes");
16       send(clientfd,ch,64,0);
17       printf("删除成功\n");
18       break;
19 }
复制代码

  然后在server.cpp中再增加一个mysql_delete_file函数

复制代码
 1 int mysql_delete_file(struct File file)
 2 {
 3     MYSQL conn;
 4     MYSQL_RES * res_ptr;
 5     MYSQL_ROW result_row;
 6     int res;int row;int column;
 7     int i,j;
 8     char sql[256];
 9     char ch[64];
10     int fid;int rt=0;
11 
12     mysql_init(&conn);
13     if(mysql_real_connect(&conn,"localhost","root","","filetranslate",0,NULL,CLIENT_FOUND_ROWS))
14     {
15         //select files.fid from files,relations where relations.fid=files.fid and filename= [file].filename
16         strcpy(sql,"select files.fid from files,relations where relations.fid=files.fid and filename=\"");
17         strcat(sql,file.filename);
18         strcat(sql,"\";");
19         res=mysql_query(&conn,sql);
20         fid=0;
21         if(res)
22         {
23             perror("Select Sql Error!");
24         }
25         else
26         {
27             res_ptr=mysql_store_result(&conn);
28             if(res_ptr)
29             {
30                 column=mysql_num_fields(res_ptr);
31                 row=mysql_num_rows(res_ptr)+1;
32                 if(row<=1)
33                     ;
34                 else
35                 {
36                     result_row=mysql_fetch_row(res_ptr);
37                     if(result_row[0]==NULL)
38                     {
39                         fid=0;
40                     }
41                     else
42                     {
43                         fid=atoi(result_row[0]);
44                     }
45                 }
46             }
47             else
48             {
49                 fid=0;
50             }
51         }
52         if(fid==0)
53         {
54             mysql_close(&conn);
55             return -1;
56         }
57         //根据获取到的fid然后删除relations对应fid和uid
58         //delect relations where uid='uid' and fid='fid'
59         strcpy(sql,"delete from relations where uid=");
60         sprintf(ch,"%d",file.uid);
61         strcat(sql,ch);
62         strcat(sql," and fid=");
63         sprintf(ch,"%d",fid);
64         strcat(sql,ch);
65         res=mysql_query(&conn,sql);
66         if(res)
67         {
68             printf("Delete Error\n");
69         }
70         else
71         {
72             ;;
73         }
74     }
75     else
76     {
77         perror("Connect Failed!");
78         exit(-1);
79     }
80 
81     mysql_close(&conn);
82     return rt;
83 }
复制代码

  从上面的sql语句可以知道我们只是删除了relations表中的链接而已。而没有真正的删除已经上传上去的文件。这一点可以参考以前给过的资料。

  运行的截图如下

 

  文件共享给好友

  client.cpp文件加入一个函数

复制代码
 1 int file_sendto(struct Addr addr,struct User user,char *filenames,struct User to)
 2 {
 3     struct sockaddr_in servAddr;
 4     struct hostent *host;
 5     struct Control control;
 6     struct File file;
 7     int sockfd;
 8 
 9     host=gethostbyname(addr.host);
10     servAddr.sin_family=AF_INET;
11     servAddr.sin_addr=*((struct in_addr *)host->h_addr);
12     servAddr.sin_port=htons(addr.port);
13     if(host==NULL)
14     {
15         perror("获取IP地址失败");
16         exit(-1);
17     }
18     if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
19     {
20         perror("socket创建失败");
21         exit(-1);
22     }
23     if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-1)
24     {
25         perror("connect 失败");
26         exit(-1);
27     }
28 
29     //控制信号
30     control.control=FILE_SENDTO;
31     control.uid=user.uid;
32     if(send(sockfd,(char *)&control,sizeof(struct Control),0)<0)
33     {
34         perror("文件指纹发送失败");
35         exit(-1);
36     }
37     file.uid=user.uid;
38     strcpy(file.filename,filenames);
39     if(send(sockfd,(char *)&file,sizeof(struct File),0)<0)
40     {
41         perror("共享文件失败");
42         exit(-1);
43     }
44     if(send(sockfd,(char *)&to,sizeof(struct User),0)<0)
45     {
46         perror("共享用户发送失败");
47         exit(-1);
48     }
49     char ch[32];
50     memset(ch,0,sizeof(ch));
51     if(recv(sockfd,ch,sizeof(ch),0)<0)
52     {
53         perror("共享文件失败");
54         exit(-1);
55     }
56     if(ch[0]=='y') //删除成功
57     {
58         printf("共享成功\n");;
59     }
60     else if(ch[0]=='n') //删除失败
61     {
62         if(ch[2]=='1')
63             printf("共享失败,确认是否有该文件\n");
64         else if(ch[2]=='2')
65             printf("共享失败,确认是否有该用户\n");
66     }
67     close(sockfd);
68     return 0;
69 }
复制代码

  而server.cpp在主函数main中switch中增加如下

复制代码
 1 case FILE_SENDTO:
 2 {
 3      struct File file;
 4      struct User to;
 5      recv(clientfd,(char *)&file,sizeof(struct File),0);
 6      recv(clientfd,(char *)&to,sizeof(struct User),0);
 7      int t=mysql_sendto(file,to);
 8      char ch[64];
 9      memset(ch,0,sizeof(ch));
10      if(t==-1)
11      {
12           printf("没有对应的文件\n");;
13           strcpy(ch,"no1");
14           send(clientfd,ch,64,0);
15           break;
16      }
17      else if(t==-2)
18      {
19           printf("没有对应的用户\n");;
20           strcpy(ch,"no2");
21           send(clientfd,ch,64,0);
22           break;
23      }
24           strcpy(ch,"yes");
25           send(clientfd,ch,64,0);
26           printf("共享成功\n");
27           break;
28 }
复制代码

  然后对应的增加下面一个函数

复制代码
  1 int mysql_sendto(struct File file,struct User to)
  2 {
  3     //insert into relations values(uid,fid);
  4     MYSQL conn;
  5     MYSQL_RES * res_ptr;
  6     MYSQL_ROW result_row;
  7     int res;int row;int column;
  8     int i,j;int fid;int uid;int rt=0;
  9     char sql[256];
 10     char ch[64];
 11 
 12     mysql_init(&conn);
 13     if(mysql_real_connect(&conn,"localhost","root","","filetranslate",0,NULL,CLIENT_FOUND_ROWS))
 14     {
 15         //select files.fid from files,relations where relations.fid=files.fid and filename=files.filename;
 16         //得到fid后
 17         strcpy(sql,"select files.fid from files,relations where relations.fid=files.fid and filename=\"");
 18         strcat(sql,file.filename);
 19         strcat(sql,"\";");
 20         res=mysql_query(&conn,sql);
 21         fid=0;
 22         if(res)
 23         {
 24             perror("Select Sql Error!");
 25         }
 26         else
 27         {
 28             res_ptr=mysql_store_result(&conn);
 29             if(res_ptr)
 30             {
 31                 column=mysql_num_fields(res_ptr);
 32                 row=mysql_num_rows(res_ptr)+1;
 33                 if(row<=1)
 34                     ;
 35                 else
 36                 {
 37                     result_row=mysql_fetch_row(res_ptr);
 38                     if(result_row[0]==NULL)
 39                     {
 40                         fid=0;
 41                     }
 42                     else
 43                     {
 44                         fid=atoi(result_row[0]);
 45                     }
 46                 }
 47             }
 48             else
 49             {
 50                 fid=0;
 51             }
 52         }
 53         if(fid==0)
 54         {
 55             mysql_close(&conn);
 56             return -1;//表示没有该文件
 57         }
 58 
 59         //select uid from users where username=[to].username;
 60         //得到uid后
 61         strcpy(sql,"select uid from users where username=\"");
 62         strcat(sql,to.username);
 63         strcat(sql,"\"");
 64         res=mysql_query(&conn,sql);
 65         uid=0;
 66         if(res)
 67         {
 68             perror("Select Sql Error!");
 69         }
 70         else
 71         {
 72             res_ptr=mysql_store_result(&conn);
 73             if(res_ptr)
 74             {
 75                 column=mysql_num_fields(res_ptr);
 76                 row=mysql_num_rows(res_ptr)+1;
 77                 if(row<=1)
 78                     ;
 79                 else
 80                 {
 81                     result_row=mysql_fetch_row(res_ptr);
 82                     if(result_row[0]==NULL)
 83                     {
 84                         uid=0;
 85                     }
 86                     else
 87                     {
 88                         uid=atoi(result_row[0]);
 89                     }
 90                 }
 91             }
 92             else
 93             {
 94                 uid=0;
 95             }
 96         }
 97         if(uid==0)
 98         {
 99             mysql_close(&conn);
100             return -2;//表示没有该用户
101         }
102 
103         //将获取到的uid fid插入到数据库relations中
104         //insert into relations values(uid,fid);
105         strcpy(sql,"insert into relations values( ");
106         sprintf(ch,"%d",uid);
107         strcat(sql,ch);
108         strcat(sql,", ");
109         sprintf(ch,"%d",fid);
110         strcat(sql,ch);
111         strcat(sql,");");
112         res=mysql_query(&conn,sql);
113         printf("==========> uid=%d  fid=%d\n",uid,fid);
114         if(res)
115         {
116             rt=-1;
117             printf("Insert Error\n");
118         }
119         else
120         {
121             printf("Insert Success\n");
122         }
123     }
124     else
125     {
126         perror("Connect Failed!");
127         exit(-1);
128     }
129     mysql_close(&conn);
130     return rt;
131 }
复制代码

  下面这个是运行时的截图

  在本次程序的最后,送上程序代码结构,及本人的开发环境。

  从程序中可以看出很多代码是有冗余的,如果进行重构的话,估计代码可以节省50%。可怕的新手啊(◑﹏◐)。从代码量上看,这次的代码量也不少了,相比与上次聊天程序,代码量有过之而不及,不过可喜的是这次都把具体的功能封装成一个一个的函数,即使有冗余代码。不过还是有点小进步了。

 

  Socket网络编程--小小网盘程序各个小节的传送门

  Socket网络编程--小小网盘程序(1) http://www.cnblogs.com/wunaozai/p/3886588.html
  Socket网络编程--小小网盘程序(2) http://www.cnblogs.com/wunaozai/p/3887728.html
  Socket网络编程--小小网盘程序(3) http://www.cnblogs.com/wunaozai/p/3891062.html
  Socket网络编程--小小网盘程序(4) http://www.cnblogs.com/wunaozai/p/3892729.html
  Socket网络编程--小小网盘程序(5) http://www.cnblogs.com/wunaozai/p/3893469.html

  本文地址: http://www.cnblogs.com/wunaozai/p/3893469.html 

  代码下载: http://files.cnblogs.com/wunaozai/xiaoxiaowangpan.zip


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

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

相关文章

进程相关概念

1.进程相关概念 进程是代码的一次动态执行&#xff0c;担当分配系统资源的角色&#xff0c;进程信息是被放在一个一个数据结构中&#xff0c;是一个结构体task_struct 2.进程控制块内容 //linux下的进程控制块 struct task_struct {volatile long state;// 说明了该进程是否可以…

SPOJ - QTREE3Query on a tree again!——树链剖分

【题目描述】 SPOJ - QTREE3Query on a tree again! 【题目分析】 题目要求是输出从111到xxx的路径上遇到的第一个黑色的点。我们可以用树链剖分&#xff08;不了解的同学请出门左拐&#xff0c;详见树链剖分入门&#xff09; 我们用线段树维护每个区间第一次遇到黑点的位置&a…

C++中的函数指针和函数对象总结

http://www.cnblogs.com/lvpengms/archive/2011/02/21/1960078.html 篇一、函数指针 函数指针&#xff1a;是指向函数的指针变量&#xff0c;在C编译时&#xff0c;每一个函数都有一个入口地址&#xff0c;那么这个指向这个函数的函数指针便指向这个地址。 函数指针的用途是很…

开发工具

1.编辑器 &#xff08;1&#xff09;vim     vim是从vi发展出来的一个文本编辑器。代码补完、编译错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 &#xff08;2&#xff09;sed     sed是一种流编辑器&#xff0c;它一次处理一行内容。处理时…

c++ 智能指针用法详解

http://www.cnblogs.com/TenosDoIt/p/3456704.html 本文介绍c里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c11支持&#xff0c;并且第一个已经被c11弃用。 为什么要使用智能指针&#xff1a;我们知道c的内存管理是让很多人头疼的事&#xff0…

CodeForces - 786BLegacy——线段树建图+最短路

【题目描述】 CodeForces - 786BLegacy 【题目分析】 题目大概意思就是有三种操作&#xff1a; 从某个点到另一个点从某个点到另一个区间从某个区间到另一个点 然后询问从其中一个点到其他所有点的距离——这很显然是一个求单源最短路径的。我们简单的想法显然是建一个图&a…

自主编写shell

1.替换原理 用fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c;子进程往往要调用一种exec函数以执行例外一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从…

HYSBZ - 2243染色——树链剖分+线段树建树技巧

【题目描述】 HYSBZ - 2243染色 【题目分析】 我一直没有看清楚题&#xff0c;以为求的是路径上出现颜色的种类&#xff0c;然后就写了一个区间染色的线段树进行维护&#xff0c;过样例的时候才发现题读错了&#xff0c;人家要求的是路径上出现的颜色段&#xff0c;所以颜色的…

打动态库和静态库

一.动态库和静态库的定义 1.静态库     程序在编译链接时把库的代码链接到可执行文件中。程序运行时就不再需要静态库 2.动态库     程序在运行的时候才去链接动态库的代码&#xff0c;多个程序 共享使用代码 3.动态链接     在执行文件之前&#xff0c;外部…

HYSBZ - 2157树链剖分

【题目描述】 HYSBZ - 2157树链剖分 【题目分析】 这道题给出的是边权而不是点权&#xff0c;但是我们分析这个树就会发现每个节点都只有一个父亲&#xff0c;也就是每条边的边权都可以存放在儿子节点上&#xff0c;然后在遍历路径的时候我们在从前往后遍历&#xff0c;但是注…

C++11中的右值引用

http://www.cnblogs.com/yanqi0124/p/4723698.html 在C98中有左值和右值的概念&#xff0c;不过这两个概念对于很多程序员并不关心&#xff0c;因为不知道这两个概念照样可以写出好程序。在C11中对右值的概念进行了增强&#xff0c;我个人理解这部分内容是C11引入的特性中最难以…

BZOJ2115XOR——线性基

【题目描述】 BZOJ2115XOR——线性基 【题目分析】 这道题看完以后很懵逼&#xff0c;人家要是走的很复杂呢&#xff1f;各种绕来绕去怎么办&#xff1f; 首先我们应该注意到一个很明显的道理&#xff1a;重复的路径会和自身抵消&#xff0c;所以我们大可以随便跑&#xff0c;…

单链表的相关操作

1.冒泡排序对单链表进行排序 void LinkListBubbleSort(LinkNode* head) {if(head NULL){ return;//空链表} if(head -> next NULL){ return;//只有一个结点} LinkNode* cur head;//趟数LinkNode* tail NULL;//尾指针LinkNode* tmp head;//次数for(; cur -…

socket网络编程--epoll小结

http://www.cnblogs.com/wunaozai/p/3895860.html 以前使用的用于I/O多路复用为了方便就使用select函数&#xff0c;但select这个函数是有缺陷的。因为它所支持的并发连接数是有限的(一般小于1024)&#xff0c;因为用户处理的数组是使用硬编码的。这个最大值为FD_SETSIZE&#…

进程间通信(匿名管道)

1.进程通信的目的 (1) 数据传输: 一个进程需要将它的数据传输给另一个进程     (2) 资源共享: 多个进程之间共享同样的资源     (3) 通知事件: 一个进程需要向另一个或一组进程发送消息, 通知它们发生了什么事情 2.管道 管道是一种进程之间通信的一种方式, 我们把从…

单例模式及C++实现代码

http://www.cnblogs.com/cxjchen/p/3148582.html 单例模式 单例模式&#xff0c;可以说设计模式中最常应用的一种模式了&#xff0c;据说也是面试官最喜欢的题目。但是如果没有学过设计模式的人&#xff0c;可能不会想到要去应用单例模式&#xff0c;面对单例模式适用的情况&am…

命名管道

1.命名管道的创建 (1) 通过命令创建 mkfifo filename (2)在程序中创建 int mkfifo(const char* filename, mode_t mode); 2. 命名管道和匿名管道的区别 (1)匿名管道由pipe函数创建并且打开     (2)命名管道有mkfifo函数创建由open函数打开     (3) fifo 之间的两…

HYSBZ - 1101——莫比乌斯反演

【题目描述】 HYSBZ - 1101 【题目分析】 昨天测试出了一道差不多的题目&#xff0c;我只能想到暴力&#xff0c;各种优化&#xff0c;最后都是运行了好久TLE&#xff0c;最后才知道要用到莫比乌斯反演&#xff0c;就想着今天研究一下&#xff0c;得出的结论就是&#xff0c;我…

Linux下I/O多路转接之select --fd_set

http://blog.csdn.net/li_ning_/article/details/52165993 fd_set 你终于还是来了&#xff0c;能看到这个标题进来的&#xff0c;我想&#xff0c;你一定是和我遇到了一样的问题&#xff0c;一样的疑惑&#xff0c;接下来几个小时&#xff0c;我一定竭尽全力&#xff0c;写出我…

I/O多路转接之poll 函数

http://blog.csdn.net/li_ning_/article/details/52167224 poll 一、poll()函数&#xff1a; 这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数&#xff0c;自认为poll和select大同小异&#xff0c;下面是这个函数的声明&#xff1a; [cpp] view plaincopy …