linux网络编程----->高并发--->多线程并发服务器

简介:

    做网络服务的时候并发服务端程序的编写必不可少。前端客户端应用程序是否稳定一部分取决于客户端自身,而更多的取决于服务器是否相应时间够迅速,够稳定.

    常见的linux并发服务器模型;


    • 多进程并发服务器

    • 多线程并发服务器

    • select多路I/O转接服务器

    • poll多路I/O转接服务器

    • epool多路I/O转接服务器.



    本次主要讨论多线程并发服务器模型:

    wKioL1dlV3ORUbUGAAISrviO-QM731.png-wh_50

    

    使用多线程模型开发服务时需要考虑以下问题

        1.  调整进程内最大文件描述符上限.

        2.  线程如有共享数据, 考虑线程同步.

        3.  服务于客户端线程退出时, 退出处理(退出值, works线程处于分离态)

        4. 系统负载, 随着链接客户的增加, 导致其它线程不能级时得到CPU      

 

    .server代码[实际开发中要特别注意函数调用返回值判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <pthread.h>
 
/*
  * 多线程并发服务器
  * author sea time 2016/06/20
  */
 
#define SERV_PORT 9096            //服务所占用端口
#define SERV_ADDR "10.10.101.105" //服务所占用ip
//线程处理函数
void * thread_handler( void * args){
     char  buf[BUFSIZ];   //BUFSIZ 内置宏 8192
     int  n, i;
     int  fd = ( int )args;   //转换获得客户端描述符
     while (1){
         bzero(buf,  sizeof (buf));
         n = read(fd, buf,  sizeof (buf));
         //对方已关闭
         if (0 == n){
             //关闭连接
             close(fd);
             printf ( "close...\n" );
             break ;
         } else  if (0 < n){
             //大小写转换
             for (i = 0; i < n; i++){
                 buf[i] =  toupper (buf[i]);
             }
             //发送给客户端
             write(fd, buf, n);
         }
     }
     pthread_exit(NULL);
}
 
int  main( int  argc,  char * argv[]){
     pthread_t tid;
     int  listenfd, connfd;
     struct  sockaddr_in serv_addr, clie_addr;
     socklen_t clie_addr_len;
     int  opt;
     char  str[INET_ADDRSTRLEN];  //INET_ADDRSTRLEN  内存宏  16
 
     //创建监听套接字
     //AF_INET:  ipv4
     //SOCK_STREAM   tcp流类型
     //IPPROTO_TCP   tcp协议
     listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
     //设置端口复用
     opt = 1;
     setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt,  sizeof (opt));
     
     //初始化为0
     bzero(&serv_addr,  sizeof (serv_addr));
     //指定族: ipv4
     serv_addr.sin_family = AF_INET;
     //指定端口号并转换成网络字节序
     serv_addr.sin_port = htons(SERV_PORT);
     //指定ip并转换为网络字节序
     inet_pton(AF_INET, SERV_ADDR, &serv_addr.sin_addr.s_addr);
     //绑定到监听套接字
     bind(listenfd, ( struct  sockaddr*)&serv_addr,  sizeof (serv_addr));
 
     //设置同时连接请求上限
     listen(listenfd, SOMAXCONN);
     while (1){
         clie_addr_len =  sizeof (clie_addr);
         //阻塞获取连接
         connfd = accept(listenfd, ( struct  sockaddr*)&clie_addr, &clie_addr_len);
         //输出连接的客户端信息
         printf ( "%s:%d connect successfully!\n" , inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, str,  sizeof (str)), ntohs(clie_addr.sin_port));
         
         //创建线程与之连接处理, 并将描述符给works线程
         pthread_create(&tid, NULL, thread_handler, ( void *)connfd);
         //设置线程分离
         pthread_detach(tid);
     }
     close(listenfd);
     return  0;
}


    多线程与多进程由模型于在linux当中CPU调试对待一样, 所以在连接数不多的请况下使用多线程和多进程非常方便.







      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1791023,如需转载请自行联系原作者




相关文章
|
10天前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
|
27天前
|
运维 监控 Linux
推荐几个不错的 Linux 服务器管理工具
推荐几个不错的 Linux 服务器管理工具
127 6
|
1月前
|
缓存 负载均衡 监控
HTTP代理服务器在网络安全中的重要性
随着科技和互联网的发展,HTTP代理IP中的代理服务器在企业业务中扮演重要角色。其主要作用包括:保护用户信息、访问控制、缓存内容、负载均衡、日志记录和协议转换,从而在网络管理、性能优化和安全性方面发挥关键作用。
69 2
|
2月前
|
弹性计算 监控 数据库
制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程
本文通过一个制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程,展示了企业级应用上云的实践方法与显著优势,包括弹性计算资源、高可靠性、数据安全及降低维护成本等,为企业数字化转型提供参考。
72 5
W9
|
2月前
|
运维 关系型数据库 MySQL
轻松管理Linux服务器的5个优秀管理面板
Websoft9 应用管理平台,github 2k star 开源软件,既有200+的优秀开源软件商店,一键安装。又有可视化的Linux管理面板,文件、数据库、ssl证书方便快捷管理。
W9
209 1
|
1月前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
77 17
|
1月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
59 10
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
66 10

热门文章

最新文章