并发服务器三种实现方式之进程、线程和select
2018-09-19 13:55
609 查看
前言:刚开始学网络编程,都会先写一个客户端和服务端,不知道你们有没有试一下:再打开一下客户端,是连不上服务端的。还有一个问题不知道你们发现没:有时启服务器,会提示“Address already in use”,过一会就好了,想过为啥么?在这篇博客会解释这个问题。
但现实的服务器都会连很多客户端的,像阿里服务器等,所以这篇主要介绍如何实现并发服务器,主要通过三种方式:进程、线程和select函数来分别实现。
先简单说下原理吧,先画个图,如下: PS:全博客园最丑图,不接受反驳!哈哈哈
View Code
总结:有不懂的,欢迎及时评论。
但现实的服务器都会连很多客户端的,像阿里服务器等,所以这篇主要介绍如何实现并发服务器,主要通过三种方式:进程、线程和select函数来分别实现。
一、进程实现并发服务器
先说下什么是并发服务器吧?不是指有多个服务器同时运行,而是可以同时连接多个客户端。先简单说下原理吧,先画个图,如下: PS:全博客园最丑图,不接受反驳!哈哈哈
/* client.c */ #include <stdio.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include "wrap.h" #define MAXLINE 80 #define SERV_PORT 8000 int main(int argc, char *argv[]) { struct sockaddr_in servaddr; char buf[MAXLINE]; int sockfd, n; sockfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr.s_addr); servaddr.sin_port = htons(SERV_PORT); Connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); while (fgets(buf, MAXLINE, stdin) != NULL) { Write(sockfd, buf, strlen(buf)); n = Read(sockfd, buf, MAXLINE); if (n == 0) printf("the other side has been closed.\n"); else Write(STDOUT_FILENO, buf, n); } Close(sockfd); return 0; }
View Code
三、select实现并发服务器
select和进程主要区别在于,进程是阻塞的,而select是交给内核自己来实现的,由于select比较复杂,参考我的另一篇博客:https://www.cnblogs.com/liudw-0215/p/9661583.html总结:有不懂的,欢迎及时评论。
相关文章推荐
- 不为客户连接创建子进程的并发回射服务器( select实现 )
- java中进程与线程--三种实现方式
- java中进程与线程_三种实现方式总结(必看篇)
- java中进程与线程的三种实现方式
- 服务器编程入门(11)TCP并发回射服务器实现 - 单线程select实现
- java中进程与线程--三种实现方式
- 并发服务器的实现(进程与线程)
- 第十九篇:不为客户连接创建子进程的并发回射服务器(select实现)
- 【Android 并发编程】线程间通信的三种基本方式,android线程
- Java第七课 Java的多线程程序进程和线程的概念,实现多线程的两种方式,线程同步的原理,线程的死锁,运用wait和notify来实现producer - consumer关系,线程终止的两种情况。
- Java基础学习之实现线程的三种方式
- 浅谈并发服务器---对三种并发方式的认识
- java线程:三种方式实现生产者消费者问题_2
- LINUX环境并发服务器的三种实现模型
- 黑马程序员-java基础-三种实现线程的方式
- JAVA中实现线程的三种方式
- Linux TCP协议使用线程实现并发服务器
- 使用Select I/O模型来实现一个并发处理多个客户端的TCP服务器
- Java并发学习之四种线程创建方式的实现与对比
- Linux 网络编程——并发服务器的三种实现模型