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,如需转载请自行联系原作者




相关文章
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
232 1
|
3月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
246 1
|
11月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
9月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
333 67
|
8月前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
225 15
|
10月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
464 23
|
11月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
224 26
|
11月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
226 17
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
260 0
Linux C/C++之线程基础
|
网络协议 Linux C语言
linux下CC++网络编程基本:socket实现tcp和udp的例子
linux下CC++网络编程基本:socket实现tcp和udp的例子
519 0