博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux网络编程----->高并发--->多线程并发服务器
阅读量:5947 次
发布时间:2019-06-19

本文共 2628 字,大约阅读时间需要 8 分钟。

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

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

    • 多进程并发服务器

    • 多线程并发服务器

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

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

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


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

    

    

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

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

你可能感兴趣的文章
Git 远程仓库(分布式版本控制系统)
查看>>
设计模式原则之里氏替换原则
查看>>
LeetCode: Longest Common Prefix 解题报告
查看>>
Multipart polyline to single part lines
查看>>
zeromq_传说中最快的消息队列
查看>>
ARM的栈指令
查看>>
两个tomcat一起启动
查看>>
javax.imageio.IIOException: Unsupported Image Type
查看>>
Oracle DBA之监听的静态注册与动态注册
查看>>
Oracle Golden Gate 系列十七 -- GG 一对多 real-time data distribution 说明 与 示例
查看>>
大照片背景在网页设计中应用的精美作品范例(下篇)
查看>>
Realtek 8192cu win8 驱动
查看>>
property 中的strong 与weak
查看>>
使用HDFS java api 创建文件出错。
查看>>
支持多个文档类型的文档视结构程序
查看>>
【原创】FIFO的基础和时序分析学习
查看>>
Nginx学习之十一-Nginx启动框架处理流程
查看>>
[置顶] 吃论扯谈---吃货和Office 365订阅的关系
查看>>
蓝桥杯 基础练习 十六进制转十进制(水题,进制转换)
查看>>
php有些系统会报错或提示 Cannot modify header information - headers already sent by
查看>>