Linux select TCP并发服务器与客户端编程

http://blog.csdn.net/szkbsgy/article/details/10558881

[cpp] view plain copy
  1. <span style="font-size:18px;">服务端:  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <string.h>  
  5. #include <sys/time.h>  
  6. #include <sys/types.h>  
  7. #include <sys/socket.h>  
  8. #include <netinet/in.h>  
  9. #include <sys/select.h>  
  10. #include <errno.h>  
  11.   
  12.   
  13. #define SERVER_IP "127.0.0.1"  
  14. #define SERVER_PORT 8000  
  15.   
  16.   
  17. #define MAX_RECV_LEN 1024  
  18. #define MAX_CLIENT_NUM 30  
  19. #define BACK_LOG 20  
  20.   
  21.   
  22. static int running = 1;  
  23.   
  24.   
  25. int main(int argc, char *argv[])  
  26. {  
  27.     int sock_fd = -1;  
  28.     int ret = -1;  
  29.     struct sockaddr_in serv_addr;  
  30.     struct sockaddr_in cli_addr;  
  31.     socklen_t serv_addr_len = 0;  
  32.     socklen_t cli_addr_len = 0;  
  33.     int client_fd[MAX_CLIENT_NUM];  
  34.     char recv_buf[MAX_RECV_LEN];  
  35.     int new_conn_fd = -1;  
  36.     int i = 0;  
  37.     int max_fd = -1;  
  38.     int num = -1;  
  39.     struct timeval timeout;  
  40.   
  41.   
  42.     fd_set read_set;  
  43.     fd_set write_set;  
  44.     fd_set select_read_set;  
  45.   
  46.   
  47.     FD_ZERO(&read_set);  
  48.     FD_ZERO(&write_set);  
  49.     FD_ZERO(&select_read_set);  
  50.   
  51.     for (i = 0; i < MAX_CLIENT_NUM; i++)  
  52.     {  
  53.         client_fd[i] = -1;  
  54.     }   
  55.   
  56.     memset(&serv_addr, 0, sizeof(serv_addr));  
  57.     memset(&cli_addr, 0, sizeof(cli_addr));  
  58.   
  59.   
  60.     sock_fd = socket(AF_INET, SOCK_STREAM, 0);  
  61.     if (sock_fd < 0)  
  62.     {  
  63.         perror("Fail to socket");  
  64.         exit(1);  
  65.     }  
  66.   
  67.   
  68.     serv_addr.sin_family = AF_INET;  
  69.     serv_addr.sin_port = htons(SERVER_PORT);  
  70.     serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);  
  71.   
  72.   
  73.     unsigned int value = 1;  
  74.     if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR,  
  75.                 (void *)&value, sizeof(value)) < 0)  
  76.     {  
  77.         perror("Fail to setsockopt");  
  78.         exit(1);  
  79.     }  
  80.   
  81.   
  82.     serv_addr_len = sizeof(serv_addr);  
  83.     if (bind(sock_fd, (struct sockaddr*)&serv_addr, serv_addr_len) < 0)  
  84.     {  
  85.         perror("Fail to bind");  
  86.         exit(1);  
  87.     }  
  88.     if (listen(sock_fd, BACK_LOG) < 0)  
  89.     {  
  90.         perror("Fail to listen");  
  91.         exit(1);  
  92.     }  
  93.   
  94.     char buf[1024];  
  95.     max_fd = sock_fd;  
  96.     int len;  
  97.     FD_SET(sock_fd, &read_set);  
  98.     while (running)  
  99.     {  
  100.         timeout.tv_sec = 5;  
  101.         timeout.tv_usec = 0;  
  102.   
  103.   
  104.         max_fd = sock_fd;  
  105.         for (i = 0; i < MAX_CLIENT_NUM; i++)  
  106.         {  
  107.             if (max_fd < client_fd[i])  
  108.             {  
  109.                 max_fd = client_fd[i];  
  110.             }  
  111.         }  
  112.   
  113.   
  114.         select_read_set = read_set;  
  115.         ret = select(max_fd + 1, &select_read_set, NULL, NULL, &timeout);  
  116.         if (ret == 0)  
  117.         {  
  118.             printf("timeout\n");  
  119.         }  
  120.         else if (ret < 0)  
  121.         {  
  122.             printf("error occur\n");  
  123.         }  
  124.         else  
  125.         {  
  126.             if (FD_ISSET(sock_fd, &select_read_set))  
  127.             {  
  128.                 printf("new client comes\n");  
  129.                 len = sizeof(cli_addr);  
  130.                 new_conn_fd = accept(sock_fd, (struct sockaddr*)&cli_addr, &len);  
  131.                 if (new_conn_fd < 0)  
  132.                 {  
  133.                     perror("Fail to accept");  
  134.                     exit(1);  
  135.                 }  
  136.                 else  
  137.                 {  
  138.                     for (i = 0; i < MAX_CLIENT_NUM; i++)  
  139.                     {  
  140.                         if (client_fd[i] == -1)  
  141.                         {  
  142.                             client_fd[i] = new_conn_fd;  
  143.                             FD_SET(new_conn_fd, &read_set);  
  144.                             break;  
  145.                         }  
  146.                         if (max_fd < new_conn_fd)  
  147.                         {  
  148.                             max_fd = new_conn_fd;  
  149.                         }  
  150.                     }  
  151.                 }  
  152.             }  
  153.             else  
  154.             {  
  155.                 for (i = 0; i < MAX_CLIENT_NUM; i++)  
  156.                 {  
  157.                     if (-1 == client_fd[i]) {  
  158.                         continue;  
  159.                     }  
  160.                     memset(recv_buf, 0, MAX_RECV_LEN);  
  161.                     if (FD_ISSET(client_fd[i], &select_read_set))  
  162.                     {  
  163.                         num = read(client_fd[i], recv_buf, MAX_RECV_LEN);  
  164.                         if (num < 0)  
  165.                         {  
  166.                             printf("Client(%d) left\n", client_fd[i]);  
  167.                             FD_CLR(client_fd[i], &read_set);  
  168.                             close(client_fd[i]);  
  169.                             client_fd[i] = -1;  
  170.                         }  
  171.                         else if (num > 0)  
  172.                         {  
  173.                             recv_buf[num] = '\0';  
  174.                             printf("Recieve client(%d) data\n", client_fd[i]);  
  175.                             printf("Data: %s\n\n", recv_buf);  
  176.                         } if (num == 0)  
  177.                         {  
  178.                             printf("Client(%d) exit\n", client_fd[i]);  
  179.                             FD_CLR(client_fd[i], &read_set);  
  180.                             close(client_fd[i]);  
  181.                             client_fd[i] = -1;  
  182.                         }  
  183.                     }  
  184.                 }  
  185.             }  
  186.         }  
  187.     }  
  188.     return 0;  
  189. }  
  190.   
  191. 客户端:  
  192. #include <stdio.h>  
  193. #include <stdlib.h>  
  194. #include <string.h>  
  195. #include <unistd.h>  
  196. #include <sys/time.h>  
  197. #include <sys/types.h>  
  198. #include <sys/socket.h>  
  199. #include <netinet/in.h>  
  200. #include <sys/select.h>  
  201.   
  202.   
  203. #define SERVER_IP "127.0.0.1"  
  204. #define SERVER_PORT 8000  
  205.   
  206.   
  207. #define MAX_RECV_LEN 1024  
  208.   
  209.   
  210. static int running = 1;  
  211.   
  212.   
  213. int main(int argc, char *argv[])  
  214. {  
  215.     int sock_fd = -1;  
  216.     int ret = -1;  
  217.     struct sockaddr_in serv_addr;  
  218.     struct sockaddr_in cli_addr;  
  219.     socklen_t serv_addr_len = 0;  
  220.   
  221.     memset(&serv_addr, 0, sizeof(serv_addr));  
  222.   
  223.   
  224.     sock_fd = socket(AF_INET, SOCK_STREAM, 0);  
  225.     if (sock_fd < 0)  
  226.     {  
  227.         perror("Fail to socket");  
  228.         exit(1);  
  229.     }  
  230.   
  231.   
  232.     serv_addr.sin_family = AF_INET;  
  233.     serv_addr.sin_port = htons(SERVER_PORT);  
  234.     serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);  
  235.   
  236.   
  237.     serv_addr_len = sizeof(serv_addr);  
  238.     if (connect(sock_fd, (struct sockaddr *)&serv_addr, serv_addr_len) < 0)  
  239.     {  
  240.         perror("Fail to connect");  
  241.         exit(1);  
  242.     }  
  243.     char buf[1024];  
  244.     int num = 0;  
  245.     while (running)  
  246.     {  
  247.         num = read(STDIN_FILENO, buf, MAX_RECV_LEN);  
  248.         if (num > 0)  
  249.         {  
  250.             buf[num] = '\0';  
  251.             printf("buf: %s\n", buf);  
  252.             num = write(sock_fd, buf, num);  
  253.             if (num < 0)  
  254.             {  
  255.                 printf("write failed\n");  
  256.                 exit(1);  
  257.             }  
  258.   
  259.   
  260.             if (strncmp(buf, "exit", strlen("exit")) == 0)  
  261.             {  
  262.                 printf("Client exit\n");  
  263.                 close(sock_fd);  
  264.                 return 0;  
  265.             }   
  266.         }  
  267.     }  
  268.     return 0;  
  269. } </span>  

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

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

相关文章

BZOJ - 2186 欧拉函数

题目的意思大概是求1~N!中和M&#xff01;互质的数的个数 因为对欧拉函数理解不够深刻所以我是分析得到结果的&#xff1a; 当N<M的时候显然符合要求的数的个数为0&#xff1b; 当N>M的时候我们要求的是1~N!中不含1 ~M的素因子的的数的个数&#xff0c;结合欧拉函数的…

多态相关概念

多态相关注意事项 所谓的多态就是指函数有多中状态, 在C中通常是通过父类指针指向子类对象的方法实现多态, 这样父类可以通过子类的类型调用不同的方法. 即实现一个接口多种方法, 多态的引用是为了实现接口复用 在 C中多态是通过虚函数来实现的. 子类通过对父类相关接口进行重…

模板实现栈队列以及链表

模板实现链表 //test.h #include <iostream> #include <cstdio> #include <assert.h> using namespace std;template <class T> struct ListNode {ListNode* _prev;ListNode* _next;T _data;ListNode(const T& x):_prev(NULL),_next(NULL),_data(…

基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr

http://blog.csdn.net/itcastcpp/article/details/12907371 请用C语言实现字符串的查找函数strstr&#xff0c; 找到则返回子字符串的地址&#xff0c;没有找到返回为空&#xff0c;请用数组操作与指针操作实现 看到题目想到最简单的方法就是母字符串和子字符串比较&#xff0c…

卡特兰数

卡特兰数的引入与n边形分成三角形的个数有关&#xff1a; 我们令f[n]表示n边形可以分成的三角形的个数&#xff0c;特殊的&#xff0c;令f[2]1 我们考虑以顶点1顶点的一个三角形&#xff0c;假设用的是n边形的k-k1边&#xff0c;那么这种情况的方案数就是f[k]∗f[n−k1]f[k]*…

软件测试相关概念

什么叫软件测试 软件测试就是测试产品没有错误,同时又证明软件是可以正确运行的 测试和调试的区别 调试一般都在开发期间 ,测试是伴随着整个软件的生命周期, 调试是发现程序中问题并且解决问题, 测试是发现程序中的缺陷 软件测试的目的和原则 目的:验证软件有没有问题 原…

Linux 线程信号量同步

https://www.cnblogs.com/jiqingwu/p/linux_semaphore_example.html 信号量和互斥锁(mutex)的区别&#xff1a;互斥锁只允许一个线程进入临界区&#xff0c;而信号量允许多个线程同时进入临界区。 不多做解释&#xff0c;要使用信号量同步&#xff0c;需要包含头文件semaphore.…

本原勾股数组

勾股数我们都很熟悉&#xff0c;a2b2c2&#xff0c;可是如何快速找到所有的勾股数组呢&#xff1f; 本原勾股数组a2b2c2性质&#xff1a; 1. a,b奇偶不同&#xff0c;c一定是奇数 2. 若b为偶数&#xff0c;c-b和cb一定是完全平方数 3. 设t>s>1,且均为奇数&#xff0c;则…

C++静态成员函数访问非静态成员的几种方法

https://www.cnblogs.com/rickyk/p/4238380.html 大家都知道C中类的成员函数默认都提供了this指针&#xff0c;在非静态成员函数中当你调用函数的时候&#xff0c;编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C灵活性下面&#xff0c;类还具备了静态成员和静…

费马大定理

当n>3时方程 xnynzn没有正整数解 结论很简洁&#xff0c;刚才看了一下证明的历史&#xff0c;我勒个去。。。。

类中的静态成员函数访问非静态成员变量

http://blog.csdn.net/u011857683/article/details/52294353 1.思路&#xff1a; 静态成员函数属于类(通过类访问&#xff0c;调用函数时没有提供this指针)&#xff0c; 非静态成员函数属于实例&#xff08;通过对象访问&#xff09;&#xff08;默认都提供了this指针&#xf…

Pollar Rho算法

原本是想把这个算法搞懂的&#xff0c;然后在网上看了又看&#xff0c;觉得&#xff0c;还是有时间再来看吧&#xff0c;我错了。 看到了一个大佬的博客&#xff0c;顺带收集一下板子 这个板子可以求大数的最大的因子。 #define LL long long bool IsPrime(LL);//返回素性测…

小知识点总结

用户输入一个url之后到整个页面返回给客户这个过程都经历了一些什么 首先url是为了让人记忆方便的,计算机在进行网络传输的过程中只能通过ip地址找到对应的主机,所以当输入一个ip地址的时候,此时就需要找对应的url,首先从浏览器中取查找ip地址,再到系统中去查找,再到域名解析服…

C++学习之普通函数指针与成员函数指针

http://blog.csdn.net/lisonglisonglisong/article/details/38353863 函数指针&#xff08;function pointer&#xff09;是通过指向函数的指针间接调用函数。相信很多人对指向一般函数的函数指针使用的比较多&#xff0c;而对指向类成员函数的函数指针则比较陌生。我最近也被问…

HDU2683——欧拉完全数

题目要求符合等式的数&#xff0c;我们首先要做的就是分析这个数&#xff1a; 对于这个等式&#xff0c;我们可能什么都看不出来&#xff0c;左边很难化简的样子&#xff0c;所以我们就要想到通过变化怎么样把右边化成和左边形式差不多的样子。结合组合数我们想到二项式定理&am…

BZOJ-2005能量采集-数论函数

很入门的数论函数题目。我还是wa了一发&#xff08;爆long long 了&#xff09; 对于每个位置x,y&#xff0c;在他们和能量采集器中间的植物为gcd(x,y)-1&#xff0c;【在他们之间说明斜率相同&#xff0c;而和他们斜率相同的就是所有gcd(x/gcd(x,y),y/gcd(x,y))1的并且比他们小…

网络五层模型

TCP/IP五层模型 应用层: HTTP,HTTPS协议,其中HTTP没有对数据进行加密操作,但是HTTPS对数据进行了加密操作 其中HTTP端口号一般是80/8080等等,HTTPS端口号是443,SSH端口号一般是22,ftp是21 HTTP协议报头: 首行:请求方法,url,协议版本 请求报头: HOST:主机 Connection:长连接…

C++的静态成员函数指针

http://blog.csdn.net/sky453589103/article/details/47276789 先简单的说说非静态的成员函数。非静态成员函数指针的类型&#xff1a;类的非静态成员是和类的对象相关的。也就是说&#xff0c;要通过类的对象来访问变量。成员函数的类型定义为&#xff1a;typedef void (A::*p…

从一个字符串中删除另一个字符串中出现过的字符

http://blog.csdn.net/walkerkalr/article/details/39001155 定义一个函数&#xff0c;输入两个字符串&#xff0c;从第一个字符串中删除在第二个中出现过的所偶字符串。例如从第一个字符串"We are students."中删除第二个字符中“auiou”中出现过的字符得到的结果是…

SPOJ-VLATTICE Visible Lattice Points-莫比乌斯反演

需要将问题分解一下。 我们需要求的是这个立方体从(0,0,0)能看到的点的个数。可是在三个含有(0,0,0)的面上我们没有办法和其他的一起进行分析&#xff08;因为含有坐标是0&#xff0c;而我们的数论工具都是从1开始的&#xff09;&#xff0c;所以我们可以将那三个面分开考虑&a…